PDA

Ver la Versión Completa : problemas con fecha en consulta


omy
28-11-2003, 23:06:47
Hola , es un problema un poco raro.

Hago una consulta por la fecha lo curioso es que solo falla cuando la variable "fecha2 := 12/11/2003" ahi falla. no lo hace.
con fecha1 := 11/11/2003 y fecha1 := 13/11/2003 lo hace perfectamente. Buscando porque, llegue a la conclusion de que con esa fecha hace referencia a mm/dd/yy y no a dd/mm/yy
revise la base de datos y si estan guardadas las fechas dd/mm/yy/


este es el codigo que uso esta muy simple..
var sql :string ;
fecha1,fecha2:string;
begin
fecha1 := DateToStr(MonthCalendar1.Date);
sql := 'Select * from historial where fecha1 >= #' + fecha1+'#' ;
adoquery1.SQL.Clear;
adoquery1.sql.Add(sql);
adoquery1.Active := true;


espero me de a entender y alguien puede decirme porque....
o como lo puedo resolver...

marcoszorrilla
28-11-2003, 23:20:26
Por qué no utilizas:

MiFecha:=FormatDateTime('mm/dd/yyyy');

Y así formateas las fechas de la manera que te convenga.

Un Saludo.

guillotmarc
28-11-2003, 23:22:59
Hola.

En realidad es muy probable que en la base de datos las fechas no estén guardadas ni en formato mm/dd/yyyy ni en dd/mm/yyyy, sinó que simplemente estarán almacenadas como un número entero. Aunque eso depende de cada servidor o base de datos que utilizes.

Cuando consultas los datos, los ves en formato dd/mm/yyyy porqué la aplicación al mostrarlos, al saber que són de tipo fecha los convierte al formato de fecha especificado en la configuración regional del ordenador.

Es muy habitual que en una sentencia le tengas que pasar los datos en el formato inglés mm/dd/yyyy. Puesto que el Servidor no puede saber el formato de fecha del Ordenador que le ha pasado la sentencia, por lo que por defecto la va a interpretar en inglés.

Si no quieres hacer muchos cambios en tu aplicación, simplemente cambia el formato en el que pasas la fecha (con el FormatDateTime('mm/dd/yyyy', Fecha)).

Aunque una forma mejor de pasar estos datos, es usando parámetros.

La consulta quedaria en (la estableces en tiempo de diseño y no en tiempo de ejecución) :

select * from Tabla where Fecha >= :FECHA

Ahora veras que en la propiedad Params del objeto Query, tienes un parámetro FECHA de tipo fecha.

Para ejecutar la sentencia, la aplicación debe dar un valor al parámetro y abrir el Query :

Query.ParamValues['FECHA'] := Fecha;
Query.Open;

Saludos.

omy
01-12-2003, 19:05:21
gracias guillotmarc

nada mas que tuve que poner estas lineas
adoquery1.Parameters.ParamValues['fecha']:=FormatDateTime('mm/dd/yyyy',MonthCalendar1.Date);
ADOQuery1.Open;
///
adoquery1.Active := false;
adoquery1.Active := true;
///
para que se pueda refrescar el dbgrid....

guillotmarc
01-12-2003, 19:25:28
Hola.

Esta linea :
adoquery1.Parameters.ParamValues['fecha']:=FormatDateTime('mm/dd/yyyy',MonthCalendar1.Date);

Quedaría mejor, simplemente con :
adoquery1.Parameters.ParamValues['fecha']:=MonthCalendar1.Date;

Ahora estás haciendo una serie de transformaciones : De Fecha a Cadena a Variant Cadena y finalmente a Fecha de nuevo.

Saludos.

omy
05-12-2003, 22:13:08
disculpa la demora .. gracias por las observaciones...


gracias