Las fechas en los motores de datos son una lata, si lo pasas como string, intentará cotejarlo con la forma "yyyy-mm-dd", si no casa, pues normalmente lo intenta con el formato "mm-dd-yyyy" y si tampoco casa, normalmente da error. Si el formato lo pasas con formato "dd.mm.yyyy" (al usar puntos como separadores, lo interpreta como fecha española).
Pero lo más normal para dejarse de rollos es:
- BBDD en dialecto 3
- campo en formato date o timestamp
- Los sqls los hace como ha dicho salvo un detalle, las fechas que sean TDate o TDatetime y usando:
Código Delphi
[-]
SQLL_Paga.Close;
SQLL_Paga.ParamByName('DESDEDATAI').AsDate := Trunc( DateTimePicker1.DateTime ); SQLL_Paga.ParamByName('FINSDATAF').AsDate := Trunc( DateTimePicker2.DateTime );
SQLL_Paga.ParamByName('ID_MECANIC').AsInteger := F_ModulDades.ActualitzaPID_Mecanic.Value;
SQLL_Paga.Open;
De esa forma es Delphi quien "se pelea con el motor de bases de datos" y le pasa la fecha en el formato correcto, sin tú saber cual es, ni tener que pelearte tú.
Ten mucho cuidado al usar DateToStr y StrTodate, porque lo codificará en el formato que delphi se le ocurra, (en realidad se basa en los formatos que tengas definidos en SysUtils y en la configuración regional de windows), para dejarte de rollos, usa FormatDatetime ('dd/mm/yyyy hh:nn', CampoFechaHora.AsDateTime).
Recuerda que en Delphi un TDateTime es un float donde la parte entera son los días transcurridos desde el día cero (30/12/1899) y la parte decimal es la hora, minutos, segundos y milisegundos.
También aconsejo usar esta otra variante en los sql:
Código SQL
[-]
WHERE (DATA between :ESDEDATAI AND :FINSDATAF)
porque a la larga es más legible, aunque si quieres quitar la igualdad de fechas, acabas haciéndolo como antes con el ">" y el "<".
Saludos