Hola lsedr, en cierto modo es lo mismo que tuvieras un único campo de tipo Fecha/Hora que tener campos específicos para Fecha y Hora.
Te explico: Para los componentes ADO, cuando se lee un campo de tipo DATETIME, TIME o DATE de SQL Server, en Delphi equivalen al tipo TDateTime.
Si es un campo DATE, en Delphi se obtiene un TDateTime con la parte Time "vacío". Si se lee un campo TIME en delphi se obtiene un TDateTime con la parte Date "vacía".
De modo que cuando haces algo como:
var
mifecha: TDateTime;
...
mifecha := ADOQuery1.FieldByNam('MiCampoFecha').AsDateTime;
en mifecha tienes tanto la parte Date como Time. En Time estará vacio. Y como para ti solo te interesa la fecha a mostrar el dato debes ignorar la parte Time. Un ejemplo:
ShowMessage(FormatDateTime('dd-mm-yyyy',mifecha));
De forma similar, cuando se desea operar con la hora:
var
mihora: TDateTime;
...
mihora := ADOQuery1.FieldByNam('MiCampoHora').AsDateTime;
Y para mostrar le damos el formato a la horas e ignoramos lo que venga en la parte Date:
ShowMessage(FormatDateTime('hh:mm',mifecha));
Por ello es que no interesa, en lo que hace a Delphi con ADO, si el campo en la base de datos es TIME, DATE o DATETIME. En ADO todos equivalen al tipo de dato TDateTime.
ADO no tiene soporte al tipo TTime y TDate (como lo tienen el resto de las suites de accedo a base de datos). Y aunque el resto tiene soporte a TTime y TDate, y es posible hacer cosas como:
var
mifecha: TDate;
...
mifecha := DataSet.FieldByName('MiCampoFecha').AsDate;
No solucionamos nada... volvemos a lo mismo. Tanto TDate como TTime son "alias" del tipo TDateTime, la diferencia del TDateTime es que el tipo está diseñado para poner vacio automáticamente la otra parte.
La ventaja de tener dos campos separados, una para la Fecha y otro la Hora es que algunas consultas se facilitan y no requieren de realizar operaciones intermedias como un CAST. En algunas consultas uno debe realizar comparaciones con fechas y horas de forma separada, entonces bajo esta premisa nos puede ser útil.
Por ejemplo Si tuviéramos un campo Fecha/Hora y se desea obtener la hora de entrada del personal para comprobar si llegan tarde (nótese que no nos interesa la parte fecha... está sobrando para el caso) uno tendrá que hacer algo como:
SELECT CAST(CampoFechaHora AS TIME)
FROM IngresoPersonal
Pero también puede conducir a redundancia, ya que se está desperdiciando espacio... Se utilizan dos campos cuando se puede trabajar con uno sólo. No interesa si se llena la hora o la fecha. Cuando se lee se recuperan los datos y en caso de estar vacio no se muestra esto.
Además, en ocasiones este diseño farovece a otros tipos de consultas: cuando se debe trabajar tanto con la parte fecha como la hora en conjunto. Por ejemplo, si uno quiere saber la fecha y hora de vencimiento de las comidas refrigeradas para ver si deben ser cambiadas, uno tranquilamente puede hacer algo como:
SELECT FechaVencimiento
FROM Productos
WHERE FechaVencimiento >= '10-11-2010 12:35'
Si tuviéramos dos campos separados tendríamos que hacer algo como:
SELECT FechaVencimiento, HoraVencimiento
FROM Productos
WHERE (FechaVencimiento >= '10-11-2010') AND (HoraVencimiento >= '12:35')
Ambos diseños tienen sus pros y contras. Debe analizarse objetivamente cual te ofrece más facilidades, de todas formas empleando ADO o cualquier otra suite de componentes deberás hacer tratamiento con el tipo TDateTime.
Cuando se leen los campos, todo los campos de fechas y horas internamente se representan con el tipo TDateTime, la única excepción es con el tipo TIMESTAMP, que en Delphi se traduce al TSQLTimeStamp para ADO.
TimeStamp es un tipo de dato Fecha/Hora con un formato especial de almacenamiento y se lo utiliza para casos en los que se requiere de precisión en los cálculos de fecha y hora a una razón, si no me falla la memoria hasta 1/10000 de segundo.
En teoría de normalización de base de datos, no es deseable disponer de un campo para la fecha y otra para la hora. En la práctica se pueden encontrar argumentos para ambos criterios, aunque por lo general para la amplia mayoría de los casos basta con usar el tipo Fecha/Hora. Los castings y las operaciones intermedias no suponen una gran pérdida del rendimiento. Podría argumentarse, allí si con más razón de peso, cuando se espera cantidades muy altas de registros.
Espero que con esto estén más claras las cosas.
Saludos,