Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Bibliotecas de código fuente > [GH Freebrary]
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-04-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Muchas gracias, ElKurgan y beginner01.

Por lo visto la persistencia de Firebird en usar espacio y no una T, tiene que ver con su apego al estándar SQL más que al estándar ISO. No es que se haya "desviado" o algo así.

Según se colige, si bien Oracle acepta el formato sin la T, es porque uno mismo tiene que indicárselo como segundo argumento de la función to_date. He leído que el parámetro de formato puede omitirse, pero entonces la función to_date de Oracle se basaría en algo llamado NLS_TERRITORY o NLS_DATE_FORMAT:
Cita:
If you omit fmt, then char must be in the default date format [...] The default date format is determined implicitly by the NLS_TERRITORY initialization parameter or can be set explicitly by the NLS_DATE_FORMAT parameter.
Supongo entonces que en Oracle no hay forma de expresar una fecha y hora de manera literal, sin poner explícitamente el formato, con la completa seguridad de que todas sus versiones y configuraciones tomarán ese valor siempre de la misma manera. A diferencia de Firebird, que parece respetar bastante su formato predeterminado. ¿Qué hay de SQLite? ¿cuál es su formato predeterminado? ¿Y en MS-SQL, MySQL, PostgreSQL, Sybase, Informix...?

Los animo a hacer más pruebas con los servidores de bases de datos que tengan instalados.
Código SQL [-]
Select 'Test' From RDB$Database  -- Cualquier tabla
  Where Current_TimeStamp  -- Cualquier cosa que sea un valor TimeStamp
  > '2012-10-14 21:04:50'  -- Una expresión literal de fecha y hora

¿Podrían ayudarme a determinar si el formato que acepta Firebird (yyyy-mm-dd hh:mm:ss) podría ser un buen default para la mayoría de los más populares motores SQL?

¿Hay o no un acomodo relativamente común o que merezca cierto respeto del año, mes, día, hora, minuto y segundo al expresar una fecha y hora literalmente en los diversos motores de bases de datos?

Por lo que voy viendo, creo que podríamos llegar a tener dos funciones: ghISODateTime (con la T) y ghSQLDateTime (con espacio), pero es muy pronto para decidir. Es necesario recabar más información.

NOTA: En el primer mensaje escribí "hh:nn:ss" y más tarde "hh:mm:ss", lo primero fue por compatibilidad con la función FormatDateTime de Delphi, pero este formato del formato no tiene importancia (sabemos que la parte cambiada se refiere a minutos). El formato de un valor literal de fecha y hora es el que importa. Insisto, ¿cuál es el más aceptado o que debiera respetarse?

Siéntanse partícipes de estas historias de colaboración. No estoy pidiendo ayuda para un proyecto personal que vaya a entregar a un cliente y por el cual me vayan a pagar. Esta es sólo una pequeña traba de diseño / concepto que vale la pena resolver en nuestra biblioteca, solución que cuando menos servirá a otras personas que busquen respuesta a las mismas inquietudes.

Saludos.
Responder Con Cita
  #2  
Antiguo 07-04-2013
beginner01 beginner01 is offline
Miembro
NULL
 
Registrado: mar 2011
Ubicación: República Dominicana
Posts: 181
Poder: 14
beginner01 Va por buen camino
En MS SQL Server funciona de las dos maneras, con T o espacio.

Código SQL [-]
Select Cast ('2013-04-30T14:25:00' As datetime)

Código SQL [-]
Select Cast ('2013-04-30 14:25:00' As datetime)

Salida
Cita:
2013-04-30 14:25:00.000
Responder Con Cita
  #3  
Antiguo 07-04-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por beginner01 Ver Mensaje
En MS SQL Server funciona de las dos maneras, con T o espacio.
Código SQL [-]
Select Cast ('2013-04-30T14:25:00' As datetime)
Código SQL [-]
Select Cast ('2013-04-30 14:25:00' As datetime)
Que bien, ¿y sin usar Cast? Digamos, como en la última sentencia que puse (la del Where).
Responder Con Cita
  #4  
Antiguo 07-04-2013
beginner01 beginner01 is offline
Miembro
NULL
 
Registrado: mar 2011
Ubicación: República Dominicana
Posts: 181
Poder: 14
beginner01 Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Que bien, ¿y sin usar Cast? Digamos, como en la última sentencia que puse (la del Where).
Funciona perfectamente.

Código SQL [-]
Select 'Test'  
  Where GETDATE()  -- En SQL Server se usa esta función para obtener la hora actual.
  > '2012-10-14 21:04:50'
Responder Con Cita
  #5  
Antiguo 07-04-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Gracias beginner01, juraría que no me aceptó algo así hace tiempo cuando tuve oportunidad de manejar MS-SQL.

Me salta la duda de si no estará convirtiendo lo que devuelve GETDATE() a cadena. Es decir, ¿realmente está haciendo una comparación de fechas o más bien es una comparación de cadenas de caracteres?
Responder Con Cita
  #6  
Antiguo 09-04-2013
beginner01 beginner01 is offline
Miembro
NULL
 
Registrado: mar 2011
Ubicación: República Dominicana
Posts: 181
Poder: 14
beginner01 Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Gracias beginner01, juraría que no me aceptó algo así hace tiempo cuando tuve oportunidad de manejar MS-SQL.

Me salta la duda de si no estará convirtiendo lo que devuelve GETDATE() a cadena. Es decir, ¿realmente está haciendo una comparación de fechas o más bien es una comparación de cadenas de caracteres?
Saludos.

Para comprobarlo ya que no aparece o no encontré suficiente documentación sobre esto realicé una prueba para ver el que ocurre
y al hacer algo como esto.

Código SQL [-]
Select 'Test'
  Where GETDATE()  
   > '2012-10-14T25:04:50'
Colocando la hora en un formato incorrecto (14T25:04:50) devuelve este error "The conversion of a varchar data type to a datetime data type resulted in an out-of-range value." con lo cual me queda claro que SQL Server convierte la fecha literal a datetime para luego hacer la comparación.

Las pruebas fueron realizadas en SQL Server 2000 y 2008.
Responder Con Cita
  #7  
Antiguo 09-04-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Muchas gracias, beginner01.

¿Renombramos la función ghISODateTime por ghSQLDateTime?
Responder Con Cita
  #8  
Antiguo 08-04-2013
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.235
Poder: 20
ElKurgan Va camino a la fama
Cita:
Empezado por Al González Ver Mensaje
Código SQL [-]
Select 'Test' From RDB$Database  -- Cualquier tabla
  Where Current_TimeStamp  -- Cualquier cosa que sea un valor TimeStamp
  > '2012-10-14 21:04:50'  -- Una expresión literal de fecha y hora

Probado en firebird 2.5
Resultado correcto

Saludos
Responder Con Cita
  #9  
Antiguo 08-04-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Después de algunas horas de búsqueda y lectura, pongo una serie de enlaces Web que me parecen relevantes para todos aquellos que se interesen en el tema de los formatos usados en expresiones literales de fecha y hora dentro del lenguaje SQL. Algunos de estos enlaces ya aparecen en mensajes anteriores, no llevan un orden específico.

http://docs.oracle.com/cd/B19306_01/...nctions183.htm

http://www.sqlite.org/lang_datefunc.html

http://msdn.microsoft.com/es-es/library/ms189491.aspx

http://en.wikipedia.org/wiki/ISO_860...epresentations

http://www.ibphoenix.com/resources/d...design/doc_169

http://publib.boulder.ibm.com/infoce...c/esqlc126.htm

http://msdn.microsoft.com/en-us/library/ms187819.aspx

http://msdn.microsoft.com/en-us/libr...#ISO8601Format

http://www.sql.org/sql-database/post...-datetime.html

http://publib.boulder.ibm.com/infoce...2Fr0008474.htm

http://www.firebirdsql.org/en/firebird-date-literals/

http://wiki.navicat.com/wiki/index.p...TIME_format%3F

Estaría bien que algunos de los compañeros se tomaran un poco de tiempo para leerlos (parcial o totalmente) y contrastar opiniones. De mi parte tengo ya algunas ideas que podrían ser concluyentes, pero ahora mismo debo ausentarme. Espero haya más retroalimentación.

Ah, si alguien tuviera la suerte de encontrar el estándar "oficial" SQL que hable sobre los formatos de cadenas literales de fecha y hora, estaría excelente.
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
Ayuda sobre manejo de fechas francodelphi Conexión con bases de datos 12 27-10-2011 01:22:15
Como definir Funciones Globales destrukthor Varios 4 07-07-2006 14:12:18
Problemas al definir UDF (Funciones en una DLL) pcicom Firebird e Interbase 2 21-06-2006 05:49:15
Definir funciones y procedimientos en FastReport???? burasu Impresión 1 16-05-2005 21:47:37
Sobre actualizaciones de programas y estándar x2 obiwuan Humor 0 06-05-2003 22:04:07


La franja horaria es GMT +2. Ahora son las 09:45:28.


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