SToD
Converte string AAAAMMDD em Date. Inverso direto de DToS. Padrao pra trabalhar com queries SQL e formatos sem ambiguidade entre US/BR.
Assinatura: SToD(cAAAAMMDD) -> dData
Retorna: Date
SToD (String To Date) converte string no formato fixo AAAAMMDD (8 chars, sem separadores) em Date AdvPL. E o conversor preferido em queries SQL e comparacoes — formato AAAAMMDD nao tem ambiguidade entre DD/MM e MM/DD.
Sintaxe
SToD(cAAAAMMDD) --> dData
// cAAAAMMDD = 8 chars exatos: AAAA + MM + DD
Exemplos
SToD("20260513") // 13/05/2026
SToD("19851231") // 31/12/1985
SToD("20240229") // 29/02/2024 (bissexto)
SToD("") // data vazia
SToD("20261332") // comportamento indefinido (mes 13?)
Comparacao com CtoD
| Funcao | Formato | Quando usar |
|---|---|---|
SToD | AAAAMMDD fixo | SQL queries, comparacoes, formato interno do Protheus |
CtoD | Conforme SET DATE (geralmente DD/MM/AAAA) | Input do usuario, telas |
Caso pratico classico: query SQL com data
// Buscar titulos vencidos
cQry := "SELECT * FROM " + RetSqlName("SE1") + ;
" WHERE E1_VENCREAL <= '" + DToS(dDataBase) + "'" + ;
" AND E1_BAIXA = ' '" + ;
" AND D_E_L_E_T_ = ' '"
TCQuery cQry New Alias "QRY"
While !QRY->(Eof())
dVencto := SToD(QRY->E1_VENCREAL) // SQL retorna AAAAMMDD
nDias := dDataBase - dVencto
ConOut("Titulo " + QRY->E1_NUM + " com " + cValToChar(nDias) + " dias atrasado")
QRY->(DBSkip())
EndDo
Caso pratico: ler arquivo CSV com data em formato fixo
// CSV com campo data no formato AAAAMMDD (sem separador)
cLinha := "001;PRODUTO A;20260513"
aCampos := Separa(cLinha, ";")
cCod := aCampos[1]
cDesc := aCampos[2]
dData := SToD(aCampos[3]) // 13/05/2026
Pegadinhas
- String invalida (menos de 8 chars, formato errado) retorna data vazia silenciosamente — sempre teste com
Empty(d). - Sem suporte a separador — "2026-05-13" ou "2026/05/13" NAO funciona. Faca
StrTranpra remover antes. - Ano deve ter 4 digitos — "851231" nao funciona como 1985.
- Hora nao incluida — pra timestamp completo use combinacao SToD + Time().
Truque util: validar formato
Static Function _VldData(cTxt)
If Len(cTxt) != 8
Return .F.
EndIf
Local d := SToD(cTxt)
Return !Empty(d)
Parâmetros
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cAAAAMMDD | Character | sim | String 8 chars no formato AAAAMMDD. |