Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Transformar fechas en SQL (https://www.clubdelphi.com/foros/showthread.php?t=59822)

santiago14 10-09-2008 03:59:19

Transformar fechas en SQL
 
Buenas, por un error garrafal puse un campo de fechas de tipo varchar en la BD y no de tipo date como debería ser.
Ahora necesito comparar esa fecha con otra y no puedo hacerlo. Uso la función CAST() del SQL de firebird pero me dá error en fechas como "18/02/2008" pues esta fecha está de la forma dd/mm/aaaa y CAST() espera que esté de la forma mm/dd/aaa.
La cuestión es que no encuentro la forma de poder realizar la comparación dentro del Where del SQL que en definitiva es lo que quiero.

Necesito por favor alguna sugerencia y/o posible solución.
Uso firebird 1.5, delphi 7.

Saludos.

Santiago.

tcp_ip_es 10-09-2008 11:41:56

Yo te aconsejaría que actualizases la BD con el campo correctamente definido, con un pequeño script...

Código Delphi [-]
//CadenaFecha es un listbox
CadenaFecha.items.delimiter:='/';
q.sql.add('select TuCampoClave,TuFecha from tutabla');
q.open;
while not(q.eof) do
begin
 CadenaFecha.items.clear;
 CadenaFecha.items.delimitertext:=q.fieldbyname('TuFecha').asstring;
 q2.clear;
 q2.sql.add(update tutabla set TuFecha2='''+ CadenaFecha.items[1] + '/'  +CadenaFecha.items[0] + '/' +CadenaFecha.items[2] + ''' 
where CampoClave=' + q.fieldbyname('TuCampoClave').asstring ); // En Firebird lo mismo cambia un poco esta sentencia pero en esencia es asi. 
 q2.execSQL;
 q.next;
end;

Con esto cargarías en el campo TuFecha2 (que sería de tipo date) la fecha correctamente, luego sería cuestión de cargarte TuFecha tipo string, y cambiarle el nombre al campo TuFecha2 a TuFecha.... espero haberte ayudado ya me dirás....

(je je hoy estoy utilizando mucho el delimiter...)

santiago14 10-09-2008 23:56:55

fechas
 
La verdad que la respuesta es muy adecuada.
Esperaba encontrar una UDF que me solucionara el problema pero resulta que rFuncUDF solo tiene DateToStr y no lo contrario. Es raro pero no tenga la función inversa pero en fin...

Muchas gracias compañero.

Saludos.

hecospina 11-09-2008 00:33:40

Hola
Puedes hacer lo siguiente

Código SQL [-]
select cast((substring(fecha from 4 for 2)||'/'||substring(fecha from 1 for 2)||'/'||substring(fecha from 7 for 4)) as date from tabla

Lo que se esta haciendo es concatenar 3 subcadenas para armar el dato de la fecha con el formato que espera la base de datos

Seria recomendable crear en la tabla original un nuevo campo con el tipo de dato correcto (date) y con un update con esta misma instruccion colocar alli la fecha real y continuar asignando la fecha a este nuevo campo

Suerte :)

santiago14 11-09-2008 02:21:08

El dichoso substring
 
Muchas gracias, creo que con esto llego a una solución con la que gano mucho tiempo. Si bien es precaria está buena.
Esto me va a enseñar a poner los tipos de datos correctos cuando haga el diseño de la BD.
No soy muy asiduo al substring pero en este caso me viene como anillo al dedo.

Otra vez agradecido.

Saludos.


La franja horaria es GMT +2. Ahora son las 03:01:34.

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