Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Problemas con CAST y campos tipo DATE (https://www.clubdelphi.com/foros/showthread.php?t=66789)

Kubelo 12-03-2010 10:46:51

Problemas con CAST y campos tipo DATE
 
Buenos días, llevo un buen rato buscando en el foro y no encuentro hilo que me ayude, así que lanzo este nuevo para ver si me pueden ayudar...

Tengo en mi aplicación una exportación a TXT desde una pantalla que ejecuta sentencias SQL, la peculiaridad es que esta exportación mediante "CAST" mantiene el tamaño de los campos y me es muy útil para implementar normas bancarias, exportaciones a programas de contabilidad, etc...

La cuestión es, tengo que realizar una exportación a una aplicación contable, y me estan dando problemas los campos tipo fecha. Necesito hacerlo con un CAST ... as VARCHAR(x), ya que mi aplicación reconoce el "largo" del campo (x) y lo rellena con vacíos para mantener la estructura que me solicitan.

Así pues si tengo en mi base de datos Firebird una fecha almacenada como 19/01/2007 y hago en mi consulta un CAST (FECHA AS VARCHAR(10)) AS FECHA firebird me devuelve 19-JAN-200 ni tan siquiera me muestra completo el año ya que el tamaño requerido es 10 y en el mes usa 3 caracteres. El formato que busco es el mismo que muestra firebird, es decir 19/01/2007 pero con cast, substr y alguna otra función más me ha sido imposible de obtener.

Agradecería cualquier ayuda! :D

guillotmarc 12-03-2010 11:29:30

Hola.

Firebird no tiene ningún formato, cuando ves que te muestra 19/01/2007 eso es porqué este es el formato de fecha que tienes definido en la configuración regional de tu Windows.

Utiliza esta sentencia para pasar al formato que quieres.

select substring(100 + extract(day from FECHA) from 2 for 2) || '/' || substring(100 + extract(month from FECHA) from 2 for 2) || '/' || extract(year from FECHA)
from TABLA

Es un poco largo pero funciona perfectamente, y no conozco ninguna forma mejor de hacerla (quizás otro compañero la sepa).

Saludos.

guillotmarc 12-03-2010 11:33:25

Por cierto, si te preguntas porqué sumo 100 a los días y meses y después lo corto con un SUBSTRING, eso es para que me quede en este formato :

12/03/2010

También podrías haber usado

select extract(day from FECHA) || '/' || extract(month from FECHA) || '/' || extract(year from FECHA)
from TABLA

Es más sencillo, pero habría quedado :

12/3/2010

Saludos.

Kubelo 12-03-2010 11:42:50

Eres Muuuuuuuuuuuuuuuuuuuuuy Grande!!

Muchas gracias! Lo solucionaste! Jeje

Gracias de nuevo!!!!!!!!

Kubelo 12-03-2010 11:47:24

Añadiendo el pertinente CAST para que mi aplicación "reserve" el tamaño claro!


XD


Thanks de nuevo!

Kubelo 12-03-2010 12:07:06

Por cierto... Adjunto una segunda opción que me ha pasado un compañero sabedor de mi problema...

select cast(DateToStr(fecha,'%d/%m/%Y') as varchar(10))
from tabla


También funciona y es mas "light", jejeje.


Gracias a los 2 de todos modos.

guillotmarc 12-03-2010 12:20:38

Gracias por compartirlo,

No conocía esta función DateToStr. En mi Firebird 2.0 no funciona, supongo que la han añadido posteriormente.

Saludos.

jhonny 12-03-2010 14:21:36

Pues yo tampoco he visto dicha función, de hecho... acabo de probarla en FB 2.5 y no funciona. Para mi que debe ser alguna UDF que han instalado en dicho server.

Gallosuarez 12-03-2010 18:26:34

Pequeña variante...
 
Srs:

Me quedo con la solución de guillotmarc, pero sin utilizar las sumas.
Código SQL [-]
select lpad(extract(day from FECHA),2,'0') || '/' || lpad(extract(month from FECHA),2,'0') || '/' || extract(year from FECHA)
from TABLA

Prefiero NO utilizar funciones UDF, desde que tuve un pequeño inconveniente al utilizar una función UDF desde un servidor de Windows a uno de Linux que no funcionaban igual en ambas plataformas. De esta manera, si voy a cambiar una base de datos de una plataforma a otra simplemente hago un "backup" y un "restore", y todo mundo feliz de la vida :D.

Espero que sirva de algo... saludos a todo el foro.

Gerardo Suárez Trejo


La franja horaria es GMT +2. Ahora son las 22:18:54.

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