Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-07-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Problema con la fecha en Firebird

Buenas a todos después de mucho tiempo sin dar la lata.

Tengo el siguiente problema.

Intento hacer una consulta filtrando por una facha determinada donde uso un datatimer que me devuelve la fecha en el formato: dd/mm/yyyy y este valor lo paso como parámetro al select.
En el dataset de FBIPLus Trial tengo configurado el formato dd/mm/yyyy. Hasta ahí bien, pero el problema es que Firebird me está tomando la fecha de otro modo: mm/dd/yyyy y claro me dá error de conversión de fecha.
He probado a poner directamente en:

...... WHERE FECHAA='23/12/2002', y dá el mismo error.

Uso Dialect 3, FBIplus Trial, Firebird...

Por más que busco no veo donde puede estar el problema.

Si alguien tiene alguna información se agradece...

saludo...
Responder Con Cita
  #2  
Antiguo 15-07-2006
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
Checa Esto...

Pasale el siguiente formato de fecha DD.MM.AAA
Ejemplo:
Código SQL [-]
Select Fecha from tabla where fecha ='30.04.2006'
Responder Con Cita
  #3  
Antiguo 15-07-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Ya lo he hecho

Eso ya lo he hecho, pero es como si inviertiera mes y día.

ese 30.04.2006 lo considera como 04.30.2006.

Si uso MDO RC2 o los componentes de Interbase de Delphi ese problema no existe...

Es raro...
Responder Con Cita
  #4  
Antiguo 16-07-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
El lenguaje sql exige que el formato de la fecha sea m/d/Y de modo que es normal que se interpreten las fechas de esa forma (tambien valdria Y/m/d).

Lo raro es que digas que con los componentes de interbase de delphi no se da el problema, ya que es exactamente igual.

Lo que hay que hacer es o usar parametros en las querys, que es la forma correcta de trabajar con las bases de datos, de modo que la conversion al formato necesario las hagan los propios componentes, o formatear las fechas con el formato m/d/y antes de construir la sentencia sql.

Saludos
Responder Con Cita
  #5  
Antiguo 16-07-2006
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 21
lbuelvas Va por buen camino
Cordial saludo,

Bueno, las fechas siempre han sido un problemilla, debido a que una cosa es la representacion interna en el motor, otra cosa es la forma en que se utilizan en SQL y otra es como se la presentamos al usuario.

Sobre la representacion interna, dejemosela a algun experto. Para la presentacion de datos al usuario, en mi caso (creo que es el de varios) utilizo el formato dd/mm/yyyy, pero en sentencias SQL se utiliza mm/dd/yyyy.

Para los que prorgramamos en Delphi y debemos construir SQL al vuelo, tendremos problema con variables de tipo TDateTime (son las que utilizo para mis variables en Delphi que tengan fechas).

Por eso diseñe una funcioncita que me convierta los TDateTime en una cadena con la fecha en el formato mm/dd/yyyy.

Código Delphi [-]
//*************************************************************************
//Funciones para manejo de fechas en general y fechas para Interbase en formato mm/dd/aaaa
//*************************************************************************

function _fecha_delimitada (fecha: TDateTime; caracter_delimitador: string) : string;
var
  anno, mes, dia: word;
begin
  DecodeDate(fecha,anno,mes,dia);
  if mes < 10 then
    if dia < 10 then
      result:=caracter_delimitador+'0'+InttoStr(mes)+'/'+'0'+InttoStr(dia)+'/'+InttoStr(anno)+caracter_delimitador
    else
      result:=caracter_delimitador+'0'+InttoStr(mes)+'/'+    InttoStr(dia)+'/'+InttoStr(anno)+caracter_delimitador
  else
    if dia < 10 then
      result:=caracter_delimitador+    InttoStr(mes)+'/'+'0'+InttoStr(dia)+'/'+InttoStr(anno)+caracter_delimitador
    else
      result:=caracter_delimitador+    InttoStr(mes)+'/'+    InttoStr(dia)+'/'+InttoStr(anno)+caracter_delimitador
end;

Espero les sea de utilidad.

Luis F. Buelvas T.
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #6  
Antiguo 16-07-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Gracias por las respuestas

Gracias a todos, en cualquier caso mantengo lo que dije, usando los componentes de Interbase o los MDO(mercury) no sucede ningún problema y puedo visualizar y pasar como parámetro a la SQL la fecha en formato dd/mm/yyyy el problema me lo da con las FIBplus,que se los tengo que pasar mm/dd/yyyy .

Un saludo....
Responder Con Cita
  #7  
Antiguo 16-07-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Cita:
el problema me lo da con las FIBplus,que se los tengo que pasar mm/dd/yyyy .
Muestranos Como lo haces.

Saludos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #8  
Antiguo 16-07-2006
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Cita:
Empezado por lbuelvas
Por eso diseñe una funcioncita que me convierta los TDateTime en una cadena con la fecha en el formato mm/dd/yyyy.
Y esta?
Código Delphi [-]
//***No tengo delphi a mano y lo hare de memoria.***

function FechaD (Fecha:TDateTime; Format:Integer=0): String;
begin
  Case Format of
   0: result:=FormatDate('dd/mm/yy', Fecha);
   1: result:=FormatDate('mm/dd/yy', Fecha);
   2: result:=FormatDate('yy/mm/dd', Fecha);
  End;
end;
Espero que funcione, pues no lo he probado.

Pero como he dicho en otros hilos, es mejor utilizar parametros para asignar cualquier fecha. Asi el componente y la BBDD se encargan del trabajo sucio de conversion.
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #9  
Antiguo 17-07-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues como ha dicho ya Mick prefiero delegar en Delphi:

Código Delphi [-]
query1.sql.text:= 'select * from tabla where fecha between :ini and :fin';
query1.parambyname('ini').AsDate := datetimepicker1.date;
query1.parambyname('fin').AsDate := datetimepicker2.date;
query1.Open;

Hacerlo de otra forma ensucia mucho el código; tampoco nos asegura de que ese motor espere una fecha en formato mm/dd/yyyy, y en último caso, una fecha del tipo 01/02/2006 puede ser interpretada tanto el 2 de Enero, como de el 1 de Febrero.

Os remito mi experiencia: trabajando con Oracle y usando un rango de fechas desde 01/02/2005 al 23/02/2005 la primera fecha la encajaba en el formato mm/dd/yyyy y la segunda fecha en dd/mm/yyyy; funcionar.... funcionaba, pero realmente no hacía lo que esperaba.

Moraleja: Parámetros pepe, siempre parámetros

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 17-07-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
No hago nada extraño

Buenas a todos, vtdeleton me pregunta que como lo hago, y ciertamente no hago nada raro.
Con la fecha de un datetimepicker y se la paso a la sentencia SELECT como parametro.

Algo así, por ej:

Código SQL [-]
SELECT FECHAT,CODIGOT,NOMBREY FROM TABLA1 WHERE FECHAT=:FECH1

donde fech1 es el parámetro que recoge el valor que le paso desde el datetimepicker, y al hacer activa la consulta(Si uso FBIplus) lanza el error de conversión de fecha, y es porque al pasar por ej. 21/12/2002 el considera que 21 es el mes, y evidentemente solo hay 12 meses, en cambio lo mismo lo hago con Mercury components o los de Interbase de Delphi y la consulta la hace perfecta(21 sería el día, y no el mes), y he hecho montón de pruebas.

Lo que digo: el problema se presenta solo con FBIplus, y haciendo lo mismo con otros componentes todo va bien, sin tocar nada.

Un saludo...
Responder Con Cita
  #11  
Antiguo 17-07-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Por curiosidad, ¿como tienes el formato de fecha definido en Windows? ¿el idioma de windows cual es?

Lo pregunto porque me resulta extraño que FIBPlus, uno de los más aclamados componentes, tengan ese tipo de "bug" (por llamarlo de alguna forma). ¿usas una versión beta o alpha de esos componentes?

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #12  
Antiguo 17-07-2006
Avatar de Hagen
Hagen Hagen is offline
Miembro
 
Registrado: ene 2004
Posts: 65
Poder: 21
Hagen Va por buen camino
Con IBX y FIBPlus me funcionan igual las fechas

Hola

Estuve haciendo pruebas con respecto a tu problema.

Estoy usando dialecto 3 con Firebird 1.5.3, Delphi 7, FIBPlus 6.3 (NO la trial),
IBX 7.06, el tipo de dato para la fecha DATE.


Al pasar la fecha con separadores '/' o con '-' lo hice
de la forma mm/dd/yyyy ó mm-dd-yyyy

Al pasar la fecha con separadores '.' lo hice
de la forma dd.mm.yyyy

De acuerdo a esto si quiero pasar el 1 de Febrero de 2006
tengo que poner 02/01/2006 ó 01.02.2006


De esta manera NO obtuve NINGUN ERROR, usando los 2 componentes de acceso
a base de datos (IBX y FIBPlus). Al decir ningun error me refiero a que
no obtenia errores de conversion y a que me devolvia el registros con la
fecha (correcta) que yo le indicaba.


Con AMBOS componentes obtuve ERROR al pasar la fecha en esta forma

30/04/2006

ó sea que en ningun caso me acepto la fecha 30/04/2006 COMO VALIDA; pero tu
dices que con IBX si te funciona?

Que version de Firebird, IBX, FibPlus, usas?

Estas usando el tipo de dato DATE o el TIMESTAMP?


PD.- Cuando dices que lo tienes configurado como dd/mm/yyyy, supongo
que te refieres a la propiedad DefaulFormats del TpFIBDataSet.
Te dire que esta propiedad SOLO sirve para indicar la forma en que
se mostrara la fecha y no tiene nada que ver con los parametros que
le pases al TpFIBDataSet
Responder Con Cita
  #13  
Antiguo 17-07-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Más datos

Saludos, añado más información al respecto.

Los FIBPlus son los 6.4
Los Mercury son la ultima RC2
Los de Interbase, son los que vienen en Delphi 7 por defecto.

dialect 3

y la ISO Española

Tipo de dato es DATE

En los tres casos, el formato de fecha que utilizo es dd/mm/yyyy, no uso dd.mm.yyyy.

Si es cierto lo del formato en el dataset, es como se muestran los datos al usuario.No tiene nada que ver.

El Firebird que uso es el 2.0(no sé hasta que punto tendrá algo que ver)

Y en los tres casos todo ha sucedido sin cambiar nada, usando las mismas sentencias SQL, que como indiqué más arriba no son nada del otro mundo, lo único que modifico son los componentes que uso, y las sentencias SQL las copio y pego de un componente a otro.

Pruebo 21/12/2003 y en:

FIBplus error(toma 21 como mes)
Mercury ok, y opero sin problemas. fecha 21 de diciembre de 2003
Paleta Interbase Delphi ok, sin problemas. fecha 21 de diciembre de 2003

No sé, yo por lo menos no doy con el problema. Es cierto que el problema es extraño y no consigo solucionarlo... Si alguien da con el problema y lo comenta aquí sería bueno para todos. Yo ya he decidido seguir con los Mercury que son los de Interbase mejorados y gratis.

Un saludo...
Responder Con Cita
  #14  
Antiguo 22-07-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
Hay algo que no estas haciendo bien. Usando parametros de la forma correcta, como el ejemplo de Lepe:

query1.parambyname('fin').AsDate := datetimepicker2.date;

No hay nunca la posibilidad de error.

La fecha no se pasa en ningun formato de cadena, sea mm/dd/YY o dd/mm/YY, se pasa en forma de variable datetime nativa de delphi (Fijarse en el AsDate ), que no es mas que un numero en punto flotante, que indica el numero de dias que han pasado desde el año 1900.
Eso significa que no puede haber nunca ningun problema de interpretacion ni de formato:

Es decir la fecha de hoy en una variable de fecha de delphi tiene el valor:

38920

Que significa simplemente que han pasado 38920 dias desde el 31 de diciembre de 1899.

Y este valor es el que se le asigna al parametro de la query, despues el componente ya se encargara de convertir ese numero al formato que sea y que necesite la base de datos. Lo que implica que no puede haber nunca ningun tipo de error en los formatos.

Da la impresion de que a pesar de usar parametros, en lugar de usar .AsDate para asignarlos se estuviese usando .AsString y pasando la interpretacion en forma de cadena en lugar de la variable Date nativa de delphi que al ser un simple numero no puede dar lugar a confusion.

Saludos
Responder Con Cita
  #15  
Antiguo 22-07-2006
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Vas a tener razón

Me temo que tienes razón, no había caído en el detalle. En vez de usar .asdate
he usado .value y he hecho:

....parameter.value:=datetostr(datetimerpicker.date);

debería haber hecho:

....parameter.asdate:=datetimerpicker.date;

He probado y ahora si funciona y no dá error. OLE!!!!
Tienes razón, lo estaba pasando como cadena...

Gracias....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Guardar null (nolo) en un campo fecha en Firebird cahosoft Conexión con bases de datos 3 19-04-2014 09:54:17
Error al hacer insert (campo fecha) en firebird con fibplus Acanol Firebird e Interbase 7 15-06-2006 09:05:07
Problema con la Fecha ramonibk Varios 1 28-02-2005 19:30:29
Formato fecha en Firebird 1.5.1 mosorio Firebird e Interbase 1 05-11-2004 17:23:46
Formato fecha en FireBird HombreSigma Firebird e Interbase 2 22-06-2003 22:18:00


La franja horaria es GMT +2. Ahora son las 19:39:30.


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
Copyright 1996-2007 Club Delphi