Ir al contenido


Foto

Obtener fecha de un campo DateTime


  • Por favor identifícate para responder
16 respuestas en este tema

#1 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 04 marzo 2011 - 09:48

hola amigos ... tengo problemas al queres obtener la fecha de un campo datetime, como en este se guarda la hora, se me hare dificil hacer comparaciones, como podria obtener solo la fecha de este campo?

saludos! (y)
  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 04 marzo 2011 - 10:42

[firebird]select Cast(MiFecha as Date) as Fecha from mitabla[/firebird]


Lo hago de memoria, pero deberia funcionar  (y) (y) (y)


  • 0

#3 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 04 marzo 2011 - 11:21

lo probare, gracias amigo!, luego aviso como me fue.
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 04 marzo 2011 - 11:31

Otra forma que *creo* que es equivalente, por si la otra te da problemas (la otra ES la buena, que con ste) es usar el DateTime como float y quitarle los decimales, creo que esos decimales son la hora, y la parte entera la fecha (en delhi es asi, en firebird creo que tambien), con lo que comparar al estilo "ABS(Fecha1-Fecha2)<1" o usar "round(cast(fecha as float))" son otras alternativas -desesperadas- a probar.
  • 0

#5 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 04 marzo 2011 - 12:26

Bueno esas opciones que comentan los compañeros son aceptables pero si lo quieres hacer en programación basta con que le apliques un FormatDateTime o utilices las funciones que vienen en la VCL DateUtils, como DateDiff(); etc...

Saludos
  • 0

#6 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 04 marzo 2011 - 02:56

Hola, sigo teniendo problemas, el cast no me funciona:

SELECT  date_in_out
FROM WORKED
where CAST(date_in_out AS DATE) = '03/03/2011'


no me devuelve nada pero si hago lo siguiente:


  SELECT  date_in_out
  FROM WORKED
  where CAST(date_in_out AS DATE) >= '03/03/2011'
 

esto si me funciona, lo que me dice que por guardar la hora en el campo no funciona, por lo tanto ... aparentemente no esta funcionando el cast, de hecho si le quito el cast me devuelve el resultado,
que puedo hacer?
  • 0

#7 cannabis

cannabis

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 257 mensajes
  • LocationMéxico

Escrito 04 marzo 2011 - 03:14



delphi
  1. SELECT date_in_out
  2. FROM WORKED
  3. WHERE date_in_out = :p1
  4. params.parambyname('p1').asdate = UnaVariableTipoFecha




Salud.

  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 04 marzo 2011 - 03:37

Hola.

Hola, sigo teniendo problemas, el cast no me funciona:


SELECT  date_in_out
FROM WORKED
where CAST(date_in_out AS DATE) = '03/03/2011'


no me devuelve nada pero si hago lo siguiente:


  SELECT  date_in_out
  FROM WORKED
  where CAST(date_in_out AS DATE) >= '03/03/2011'
 

esto si me funciona, lo que me dice que por guardar la hora en el campo no funciona, por lo tanto ... aparentemente no esta funcionando el cast, de hecho si le quito el cast me devuelve el resultado,
que puedo hacer?


La verdad es que utilizo continuamente este tipo de conversiones (cast as date) y funcionan de maravilla.

¿ Seguro que tu base de datos no tiene algo extraño ?, ¿ no será dialecto 1 o algo así ?. Puesto que en estos modos de compatibilidad con versiones arcaicas de Interbase, los tipos de datos se tratan distinto.

¿ Seguro que hay registros de esa fecha ?, a veces las causas de los comportamientos extraños tienen razones tan sencillas como esta.

NOTA: Por cierto, ¿ supongo que ya sabes que si pasas una fecha como cadena lo tienes que hacer en formato americano (mes-día-año) y no en el que usamos habitualmente en castellano (día/mes/año) ?.

Esta consulta debería funcionar perfectamente :


SELECT  date_in_out
FROM WORKED
where CAST(date_in_out AS DATE) = '03-03-2011'


Pero si quieres evitar el uso de conversiones cast, entonces utiliza esta consulta equivalente :


SELECT  date_in_out
FROM WORKED
where date_in_out >= '03-03-2011' and date_in_out < '03-04-2011'


NOTA: Como comenta cannabis, yo también te recomiendo que utilices parámetros para la consulta.

Saludos.
  • 0

#9 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 04 marzo 2011 - 04:02



delphi
  1. SELECT date_in_out
  2. FROM WORKED
  3. WHERE date_in_out = :p1
  4. params.parambyname('p1').asdate = UnaVariableTipoFecha




Salud.


no creo que esto funcione ya que en el campo date_in_out hay datos como '03/03/2011 07:45:30 a.m.'
al igualarlo a una variable que solo contenga la fecha estaria haciendo lo mismo.
  • 0

#10 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 04 marzo 2011 - 04:18

Hola.


Hola, sigo teniendo problemas, el cast no me funciona:


SELECT  date_in_out
FROM WORKED
where CAST(date_in_out AS DATE) = '03/03/2011'


no me devuelve nada pero si hago lo siguiente:


  SELECT  date_in_out
  FROM WORKED
  where CAST(date_in_out AS DATE) >= '03/03/2011'
 

esto si me funciona, lo que me dice que por guardar la hora en el campo no funciona, por lo tanto ... aparentemente no esta funcionando el cast, de hecho si le quito el cast me devuelve el resultado,
que puedo hacer?


La verdad es que utilizo continuamente este tipo de conversiones (cast as date) y funcionan de maravilla.

¿ Seguro que tu base de datos no tiene algo extraño ?, ¿ no será dialecto 1 o algo así ?. Puesto que en estos modos de compatibilidad con versiones arcaicas de Interbase, los tipos de datos se tratan distinto.

¿ Seguro que hay registros de esa fecha ?, a veces las causas de los comportamientos extraños tienen razones tan sencillas como esta.

NOTA: Por cierto, ¿ supongo que ya sabes que si pasas una fecha como cadena lo tienes que hacer en formato americano (mes-día-año) y no en el que usamos habitualmente en castellano (día/mes/año) ?.

Esta consulta debería funcionar perfectamente :


SELECT  date_in_out
FROM WORKED
where CAST(date_in_out AS DATE) = '03-03-2011'


Pero si quieres evitar el uso de conversiones cast, entonces utiliza esta consulta equivalente :


SELECT  date_in_out
FROM WORKED
where date_in_out >= '03-03-2011' and date_in_out < '03-04-2011'


NOTA: Como comenta cannabis, yo también te recomiendo que utilices parámetros para la consulta.

Saludos.


hola amigo, no soy un astro ni nada por el estilo en base de datos firebird pero....
estoy utilizando el dialecto1, podria estar generando esto algun problema?

  • 0

#11 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 04 marzo 2011 - 10:10

Observa esto:

• Both dialects have a date/time type named DATE, but they are different types.
The dialect 1 DATE is equivalent to the dialect 3 TIMESTAMP, and the dialect 3
DATE is a date-only type not supported in dialect 1.
• Dialect 3 supports a TIME (time-of-day) type, which is unsupported in dialect 1.



Por esta razón es que el Cast  como está planteado no funciona para el dialecto I.

Pienso que toca hacerlo a mano desde delphi, decodificando la fecha.

Aquí  Sarko expone las diferente rutinas para trabajar con fechas.

Saludos
  • 0

#12 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 05 marzo 2011 - 03:49

Creo que podria funcionarte algo asi:

SELECT  date_in_out
FROM WORKED
WHERE CAST(date_in_out AS integer) = CAST(CAST('03.03.2011' as date) as integer)

La idea es ver si la fecha tipo "timestamp" al convertirla a entero te sirve como fecha.

En la fecha escrita, pongo puntos de separadores para que lo interprete como dd.mm.yyyy, lo convierto a date -timestamp en dialecto 1- para luego quedarme con su parte entera.

Creo que deberia funcionar, pero hace siglos que no uso el dialecto 1, siempre uso el 3 que es mejor en todo.
  • 0

#13 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 05 marzo 2011 - 10:05

La otra forma que se me ocurre es hacer un >= a la fecha desde la 00:00:00 y un <= a la fecha hasta la 23:5959
  • 0

#14 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 05 marzo 2011 - 10:42

hola amigos, creo que mejor creare de nuevo la base de datos con el dialecto 3 , no pense que fuera a tener problemas,
es una aplicacion muy pequeña , de hecho por ahora solo tendre 2 tablas.
agradezco sus comentarios, saludos!
  • 0

#15 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 05 marzo 2011 - 12:43

La otra forma que se me ocurre es hacer un >= a la fecha desde la 00:00:00 y un <= a la fecha hasta la 23:5959


Hola.

Para no tener que lidiar con el engorro de poner la hora del parámetro a las 59:59, lo más fácil en este caso es hacer una comparación mayor o igual a la fecha buscada (con hora 00:00) y menor estricto al día siguiente.

Es decir :

CAMPO_FECHA >= :DIA and CAMPO_FECHA < :DIA + 1

Saludos.
  • 0

#16 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 05 marzo 2011 - 12:44

hola amigos, creo que mejor creare de nuevo la base de datos con el dialecto 3 , no pense que fuera a tener problemas,
es una aplicacion muy pequeña , de hecho por ahora solo tendre 2 tablas.
agradezco sus comentarios, saludos!


Es lo mejor que puedes hacer (el Dialecto 1 solo es un modo de compatibilidad con versiones antiguas), si puedes evitar utilizarlo, mejor.

Saludos.
  • 0

#17 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 07 marzo 2011 - 04:58

REcuerda que con IBPump puedes leer de una base con dialecto 1 y copiar todo a otra con dialecto 3 (el programa se creo para esto precisamente) y adema,s puedes crear la base de datos vacia dialecto 3 usando gbak.exe directamente.

Tienes un paso a paso en nuestra web (esta pensado para recuperacion en caso de catastrofe, pero el procedimiento es igual):

Paso 1: Crear una base de datos igual a la existente pero vacia en dialecto 3:

http://www.firebirdfaq.org/faq73/

NOTA: Normalmente yo uso "gbak -m rota.gdb vacia.gbk" y luego "gbak -c vacia.gbk vacia.gdb" pero parte de un fichero en dialecto 3, asi que no se si esto serviria, pero parece que no.

Paso 2: Copiarte los datos:

IBPump: http://www.hcsoft.ne...cer&hoja=ibpump
  • 0




IP.Board spam blocked by CleanTalk.