Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Campo tipo date marcado como NULL retorna una fecha extraña (3/12/1899) (https://www.clubdelphi.com/foros/showthread.php?t=96108)

pgranados 15-02-2023 18:48:22

Campo tipo date marcado como NULL retorna una fecha extraña (3/12/1899)
 
Buen día, ¿Alguien ha tenido el error comentado en el titulo, tengo un registro en mi tabla donde el campo FECHA viene como NULL , pero al hacer la validación en Delphi (Ya que, si el valor es Nulo, debo de insertar la fecha del día de hoy, pero si Fecha tiene algún valor debo de dejarlo como esta) me retorna una fecha extraña (30/12/1899) :confused::confused::confused::confused:

La validación la hago de la siguiente manera:
Código Delphi [-]
if DateToStr(DM.FDQueryFecha.Value) = '' then
begin
DM.FDQuery.Edit;
DM.FDQueryFecha.Value:= now;
DM.FDQuery.Post;
showMessage('Fecha Actualizada');
end;

Saludos.

pgranados 15-02-2023 19:49:50

Estuve investigando, y realmente sucede esto porque el campo Date nunca se queda como NULL, solamente toma una "Fecha Random?"

Total, esta fecha: 30/12/1899 ¿es la que se queda fija? o siempre cambiara? :eek:

Saludos

Casimiro Notevi 15-02-2023 20:28:39

Es que al ser null, se interpreta como cero, y firebird cuenta los días a partir del 30/12/1899 por lo que 1 es 31/12/1899, 2 es 01/01/1900, etc...
Lo que debes hacer es algo como: if fecha is null then fecha = now;
O la fecha por defecto que te venga mejor.

movorack 15-02-2023 20:45:32

¡Hola, pgranados!

No es una fecha random, el cálculo de fechas en Delphi empieza desde el 30/Dic/1899. En un valor numérico (Double) que va aumentando desde ese día.

System.TDateTime
Cita:

TDateTime implementa el tipo de datos Delphi TDateTime y las rutinas de biblioteca de tiempo de ejecución de fecha/hora que utilizan el tipo de datos TDateTime.

La clase TDateTime hereda un miembro de datos val, declarado como double, que contiene el valor de fecha y hora. La parte entera de un valor TDateTime es el número de días que han pasado desde el 30 de diciembre de 1899. La parte fraccionaria de un valor TDateTime es la hora del día. La fecha correcta máxima admitida por los valores TDateTime está limitada al 31/12/9999 23:59:59:999. Todos los valores que van más allá de esta fecha causan errores y excepciones en la mayoría de las rutinas que operan con valores TDateTime.
Entonces:
0 = 30/12/1899
2.75 = 1/Ene/1900; 6:00 P.M.
35065 = 1/Ene/1996; 12:00 A.M
44972 = 15/Feb/2023; 12:00 A.M.

Cuando en tu consulta validas el campo de fecha y en la tabla está como null. Al leerlo como TDateTime, se convierte a 0 y por lo tanto a la fecha que indicas.

Si lo que debes validar es si el campo está null puedes usar la función IsNull.

Código Delphi [-]
if DM.FDQueryFecha.isNull then
begin
  DM.FDQuery.Edit;
  DM.FDQueryFecha.Value:= now;
  DM.FDQuery.Post;
  showMessage('Fecha Actualizada');
end;

pgranados 15-02-2023 21:48:23

Gracias Casimiro y movorack, de gran ayuda. Saludos. :D


La franja horaria es GMT +2. Ahora son las 11:34:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi