Declaración de caso – Desajuste en el tipo de dato de expresión en THEN/ELSE.
Este es en Teradata.
Estoy tratando de escribir una declaración CASE que funcione si los datos vienen en el siguiente formato:
YYYY-MM-DD ej. 2021-12-17
MM/DD/YYYY ej. 12/17/2021
YYYYMMDD ej. 20211217
Excel Serial ej. 44547 Nota: Este es un formato de Excel que cuenta los días desde 1899-12-30, por lo que 44547 representa el 17/12/2021
La declaración CASE a continuación funciona si los datos vienen en los formatos YYYYMMDD o Excel Serial, pero si los datos vienen en los formatos YYYY-MM-DD o MM/DD/YYYY solo funciona si elimino los últimos 2 “when”. De lo contrario, recibo un error de “Tipo de datos incompatibles en la expresión THEN/ELSE”.
CASE
WHEN POSITION(‘-‘ IN SUBSTR(DW_EFF_DT, 5)) <> 0 THEN CAST(DW_EFF_DT AS DATE FORMAT ‘YYYY-MM-DD’)
WHEN POSITION(‘/’ IN SUBSTR(DW_EFF_DT, 5)) <> 0 THEN CAST(DW_EFF_DT AS DATE FORMAT ‘MM/DD/YYYY’)
WHEN CHARACTERS(TRIM(DW_EFF_DT))=8 THEN CAST(SUBSTR(DW_EFF_DT,1,4)||’-‘||SUBSTR(DW_EFF_DT,5,2)||’-‘||SUBSTR(DW_EFF_DT,7,2)) AS DATE FORMAT ‘YYYY-MM-DD’)
WHEN CHARACTERS(TRIM(DW_EFF_DT))=5 THEN CAST(‘1899-12-30’ AS DATE FORMAT ‘YYYY-MM-DD’) + DW_EFF_DT
ELSE NULL
END AS DW_EFF_DT
Gracias por cualquier ayuda, se agradece mucho.
Editar: Gracias por las respuestas. Me ayudaron a resolverlo. La corrección necesitaba que la última declaración WHEN se vea así:
WHEN CHARACTERS(TRIM(DW_EFF_DT))=5 THEN (CAST(CAST(‘1899-12-30’ AS DATE FORMAT ‘YYYY-MM-DD’) + DW_EFF_DT AS DATE FORMAT ‘YYYY-MM-DD’))
davy.ai
Para manejar todos los formatos de fecha en una sentencia case en Teradata, puedes modificar la sentencia case existente de la siguiente manera:
Las dos primeras condiciones WHEN manejan los formatos con separadores ‘-‘ y ‘/’ respectivamente. La tercera condición maneja el formato YYYYMMDD. La cuarta condición maneja el formato serial de Excel, donde primero convertimos el número de serie a un entero y luego lo sumamos a la fecha base, es decir, 1899-12-30. Finalmente, convertimos el resultado a un formato DATE de YYYY-MM-DD.
Ten en cuenta que el uso de la función SUBSTR se modificó para verificar toda la cadena en busca de los separadores ‘-‘ y ‘/’, ya que no estamos seguros de la posición de estos separadores en los datos de entrada.