O DataFlex tem dois tipos de dados que armazenam dados semelhantes: Date e DateTime. Pode ser confuso para os desenvolvedores quando usar um ou outro em seu código, especialmente ao usar drivers DataFlex para MS SQL.
O que há de diferente nos dois tipos de dados e qual é a maneira recomendada de lidar com eles em uma aplicação?
Date é um tipo simples que é usado para declarar variáveis para armazenar tokens de data.
Um token de data do DataFlex é representado por uma sequência de números e separadores que representam o dia, mês e ano de uma data específica. A ordenação dos dígitos de dia, mês e ano e o tipo de separador usado é configurável e transparente.
Por padrão, o DataFlex representa datas no seguinte formato: mm/dd/yyyy. Onde mm representa o mês (1-12), dd o dia (1-31 ou qualquer que seja o dia máximo para um determinado mês) e yyyy é o ano (0001 - 2500).
O DataFlex pode ser configurado para usar datas européias no formato dd/mm/aaaa ou datas militares no formato aaaa.mm.dd.
O intervalo de valores para o tipo de dados Date é de 01/01/0001 a 01/01/2500.
O tipo DateTime corresponde a um SQL_TIMESTAMP_STRUCT, conforme definido no ODBC (https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/c-data-types).
Os tipos DateTime são usados para declarar variáveis para armazenar valores de data e hora com uma precisão de até milissegundos.
O intervalo de valores para o tipo de dados DateTime é 1/1/-32768 12: 00: 00.000 AM a 12/31/32767 11: 59: 59.999 PM.
Observe que, embora o tipo de dados DateTime possa conter qualquer valor dentro desse intervalo, outras rotinas de cálculo, manipulação e armazenamento DateTime podem ter outros limites e você deve consultar a documentação das rotinas específicas para limitações adicionais.
Conforme discutido na postagem do blog DataFlex Date no Microsoft SQL Server World, o Microsoft SQL Server inclui alguns tipos de dados Date e DateTime que podem ser usados em tabelas SQL.
Dependendo da versão do SQL Server que está sendo usada, determinados padrões e opções serão aplicados. Estes podem ser personalizados para atender às necessidades da aplicação que acessa os dados. Para mais detalhes sobre isso, consulte a postagem no blog DataFlex Date in the Microsoft SQL Server World.
Todas as colunas no DataFlex têm um tipo SQL_Type e DataFlex. O Editor de Tabelas no Studio os identifica como Tipo (ou seja, Tipo SQL) e Tipo DataFlex.
Quando se trata dos tipos de dados Date e DateTime, as seguintes possibilidades se aplicam:
1) SQL_Date DF_Date
2) SQL_Datetime2 DF_Datetime
3a) SQL_Datetime DF_Date
3b) SQL_Datetime DF_Datetime
Para SQL_DateTime, você pode selecionar se deseja usar DF_Date (3a) ou um DF_DateTime (3b). No Studio, essa seleção pode ser feita com a configuração do "tipo DataFlex" da coluna.
Recomenda-se usar SQL_Date (1) para colunas Date e SQL_Datetime2 (2) para colunas DateTime.
Por razões históricas, a combinação 3a) ainda é bastante comum em bancos de dados e aplicações existentes. Nas versões do DataFlex anteriores à versão 19.0, SQL_Datetime seria mapeado para DF_Date por padrão.
Em um cenário em que uma coluna SQL_Datetime deve ser definida como DF_Date, primeiro escolha SQL_Type SQL_Datetime e, em seguida, escolha DF_Date para DF_Type.
Independentemente dos tipos de SQL subjacentes, lembre-se de que os dois tipos de dados (DF_Date e DF_DateTime) são diferentes e precisarão ser tratados de maneiras diferentes no seu programa.
Embora as datas do DataFlex possam ser definidas e manipulem um valor zero, o DateTime não pode fazer isso. O tipo de dados Date é um valor numérico de baixo nível que contém o número de dias. O tipo de dados Datetime é internamente uma estrutura de registro de data e hora que não pode conter um valor numérico simples como 0.
Por exemplo:
Date dMyDate
Move 0 to dMyDate // Isto funciona
If (dMyDate = 0) Begin // Isto funciona
Showln "dMyDate é 0"
End
DateTime dtMyDatetime
Move 0 to dtMyDatetime // Gera erro: Illegal Datatype Conversion
If (dtMyDatetime = 0) Begin // Gera erro: Illegal Datatype Conversion
Showln "dtMyDatetime é 0"
End
Este exemplo usa variáveis Date e DateTime, mas é o mesmo com as colunas Date e DateTime em um banco de dados:
If (Vendor.DateColumn = 0) Begin // Isto funciona
Showln "Date é 0"
End
If (Vendor.DatetimeColumn = 0) Begin // Gera erro: Illegal Datatype Conversion
Showln "Datetime é 0"
End
Para o tipo de dados DateTime, você deve usar IsNullDateTime para verificar NULL:
If (IsNullDateTime(Vendor.DatetimeColumn)) Begin
Showln "Datetime é null"
End
Saber isso o ajudará a evitar erros na sua aplicação e a obter aos resultados que você deseja.
Fontes