PDA

Ver la Versión Completa : Transformar fechas en SQL


santiago14
10-09-2008, 03:59:19
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...


//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
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

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
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.