Hola nuevamente.
Primero debes entender que como te hemos dicho la fecha den Delphi (TDate, TDateTime, TTime) es un tipo de dato que básicamente es un numero flotante. Donde la parte entera es la fecha y la parte decimal es la hora
Código Delphi
[-]
procedure MostrarFecha;
var
lDate : TDateTime;
lNum : Extended;
begin
lDate := Now;
lNum := lDate;
ShowMessage('Fecha('+FloatToStr(lNum)+'): '+ DateTimeToStr(lDate));
end;
Los motores de bases de datos almacenan la fecha de igual manera
Código SQL
[-]
SELECT
CONVERT(DATETIME, '08/03/2017', 103) AS FECHA1,
CONVERT(DATETIME, 42800, 103) AS FECHA2,
CAST(42800 AS DATETIME) AS FECHA3
-- RESULTADO
-- FECHA1 FECHA2 FECHA3
-- ----------------------- ----------------------- -----------------------
-- 2017-03-08 00:00:00.000 2017-03-08 00:00:00.000 2017-03-08 00:00:00.000
Entonces, cuando comparas una fecha que almacenaste como texto, estás comparando solo texto.
Es decir: Si almacenaste un rango de '8:00' a las '17:30' y tratas de compararlo con las '14:30' verás que está fuera de rango porque en el ordenamiento de texto '8:00' es mayor a '14:30'
Como ya te dije antes.
En la DB debes usar campos del tipo que almacene la fecha (TIME en SQL Server)
En el programa, no importa mucho que componente uses. si es un DataControl como un DBEdit, el DataSet se encargará de controlar si se ingresa o no un valor válido de fecha.
Si no es un DataControl como un TDateTimePicker o un TEdit, entonces si se requiere debes convertirlo primero a fecha y luego almacenarlo o compararlo con los valores de la DB.
Y por ultimo.
Lee los links que te he dejado
MS SQL Server - Data Types
Delphi Basics - Dates and Times
Además de estos
Funciones y procedimientos para fecha y hora (I)
Funciones y procedimientos para fecha y hora (II)
Funciones y procedimientos para fecha y hora (III)
Y si quieres crear tu propio componente DB-Aware para manejar el campo date
How to create data-aware components