Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Duda entre tipos de datos en SQL

Buenos días,

estoy desarrollando un script en el que se puedan hacer recargas parciales de una base de datos.

Ya lo he desarrollado otras veces por lo que tengo clara la dinámica de funcionamiento, sin embargo en este caso estoy teniendo errores con el tipo de datos SQL. La única pega es que las veces que lo he utilizado, la variable FECHA sobre la que trabajaba era de tipo datetime y en este caso la variable FECHA es de tipo date.

En primer caso leo la fecha máxima de la base de datos:

Lectura del valor más reciente de la base de datos.

Fecha_maxima_tmp:

LOAD Max(FECHA) as FECHA

FROM METEO_HCO_VALORES.qvd (qvd);

Y me lo guardo en una variable quitando 7 días(esto es un truco que tuve que inventar ya que los datos de los últimos 7 días pueden ir variando):

Variable vMaxFecha - Caso 1
LET vMaxFecha = ((Round(Peek('FECHA',0,'Fecha_maxima_tmp')))-7);

Consulta a la base de datos de los datos de esos últimos 7 días:

Consulta - Caso 1

METEO_HCO_VALORES:

LOAD

    FECHA as FECHA,

    Year(FECHA) as año,

    Month(FECHA) as mes,

    Day(FECHA) as dia,

    VALOR;

SQL SELECT *

FROM AREAMA."AMA_METEO_HCO_VALORES"

WHERE FECHA > ($(vMaxFecha));

Aquí ya me encuentro el siguiente error:

Captura de pantalla (11).png

Al ver ese error se me ocurre cambiar la Variable vMaxFecha:

Variable vMaxFecha - Caso 2
LET vMaxFecha = date((Round(Peek('FECHA',0,'Fecha_maxima_tmp')))-7);

y dejar la consulta igual que en el Caso 1 pero me encuentro con el mismo error.

Al ver ese error busco otra solución y es dejando la variable vMaxFecha como el Caso 1 y cambiando la consulta a :

Consulta - Caso 3

METEO_HCO_VALORES:

LOAD

    FECHA as FECHA,

    Year(FECHA) as año,

    Month(FECHA) as mes,

    Day(FECHA) as dia,

    VALOR;

SQL SELECT *

FROM AREAMA."AMA_METEO_HCO_VALORES"

WHERE FECHA > to_date($(vMaxFecha));

Me encuentro el error:

Captura de pantalla (13).png

Y ya por último pruebo el script como la variable vMaxFecha como el caso 2 y la consulta como el caso 3 y me encuentro el error:

Captura de pantalla (14).png

Quería saber si alguien podría ayudarme.

Gracias!

1 Solution

Accepted Solutions
Not applicable
Author

La respuesta correcta gracias a sorrakis01‌y a joaquinlr‌‌es esta:


LET vFechaMax = chr(39)& Date(Today(), 'YYYY/MM/DD') & chr(39);


SELECT *

               FROM Tabla

              Where FECHA > $(vFechaMax);


View solution in original post

14 Replies
JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Carlos:

Contra una BBDD Oracle este where me funciona, hoy vCAMh = 20160630

WHERE FECHA > $(vCAMh)

   AND (FECHA > 20130303 AND EMP = 'XXXX' )

Aquí compruebo una fecha formato TimeStamp contra una variable cuyo valor es '2016/08/24' contra MySQL

WHERE Date(t.RECORDDATE) <= $(vFechaMax)

Para convertir algunas fechas en formato timestamp a fecha tienes que usar la función MAKEDATE

Saludos

Joaquín

Not applicable
Author

Hola Joaquín, gracias por interesarte en el tema.

Con variables fecha en formato TimeStamp o Datetime lo he conseguido pero se me sigue resitiendo porque en este caso en la BBDD el campo FECHA es Date. He probado a convertir la variable FECHA en el where pero no lo he conseguido, además no tengo muy claro que eso se pueda hacer así.

Gracias de todas formas.

Un saludo

sorrakis01
Specialist
Specialist

Hola Carlos,

Una duda, si tu pruebas la última query en el SQL te funciona?

Es decir: SELECT *

               FROM Tabla

              Where FECHA > toDate(17/08/2016)

Esto te funciona?

Saludos,

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Carlos:

La variable que muestras tiene valor 42599, es importante que tanto tu variable como tu campo de BBDD tengan el mismo formato numérico o de fecha, si además es tipo date es importante el orden de los campos YYYY/MM/DD o DD/MM/YYYY.

Si general el log de la recarga, busca la sentencia SQL con las variables expandidas y la copias; con eso quizá veamos más claro el problema.

Saludos

Joaquín

Not applicable
Author

Hola Jordi,

He probado y me da error con identificador no válido. Cuando probé:

SELECT *

               FROM Tabla

              Where FECHA > to_Date(17/08/2016)

decía que se ha encontrado un carácter no númerico donde se esperaba uno númerico

sorrakis01
Specialist
Specialist

Hola Carlos,

Entonces el problema lo tienes en la query no? es decir el campo FECHA en tus datos como es?

dd/mm/yyyy hh:mm:ss?

Que pasa si pruebas esto:

SELECT *

               FROM Tabla

              Where FECHA > 17/08/2016

o esto:

SELECT *

               FROM Tabla

              Where FECHA > '17/08/2016'

Si usas el to_date, si no me equivoco es para pasar un string a fecha pero para ello te falta indicarle el formato y que la fecha sea string, es decir to_date(''20160817','YYYYMMDD')

Saludos,

Not applicable
Author

Hola Joaquín,

ya tengo claro lo de los formatos en que la BBDD tiene que coincidir con el de la variable. La columna de la BBDD es de tipo date pero tiene el siguiente formato: "DD/MM/AAAA hh:mm:ss"

Aquí te paso las sentencias SQL del log:

2016-08-30 08:54:24 0073 Fecha_maxima_tmp:

2016-08-30 08:54:24 0074 LOAD Max(FECHA) as FECHA

2016-08-30 08:54:24 0075 FROM METEO_HCO_VALORES.qvd (qvd)

2016-08-30 08:54:30       1 campos encontrados: FECHA,

2016-08-30 08:54:30      1 registros leídos

2016-08-30 08:54:30 0080 LET vMaxFecha = Peek('FECHA',0,'Fecha_maxima_tmp')

2016-08-30 08:54:30 0100 SQL SELECT *

2016-08-30 08:54:30 0101 FROM AREAMA."AMA_METEO_HCO_VALORES"

2016-08-30 08:54:30 0102 Where FECHA > to_Date(24/08/2016 0:00:00)

2016-08-30 08:54:31      Error: SQL##f - SqlState: S1000, ErrorCode: 907, ErrorMsg: [Oracle][ODBC][Ora]ORA-00907: falta el paréntesis derecho

Saludos,

Carlos

JoaquinLazaro
Partner - Specialist II
Partner - Specialist II

Hola Carlos

SELECT *

               FROM Tabla

              Where ToDate(FECHA) > '17/08/2016'

Saludos

Joaquín

Not applicable
Author

Hola Jordi,

utilizando esta consulta si que funciona correctamente.

SELECT *

               FROM Tabla

              Where FECHA > '17/08/2016'

Habría alguna forma de comparar la FECHA con una variable en vez de poner '17/08/2016'?

Gracias