es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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’))

Tags:  , ,

Answer

  1. Avatar for 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:

    CASE
        WHEN POSITION('-' IN DW_EFF_DT) > 0 THEN CAST(DW_EFF_DT AS DATE FORMAT 'YYYY-MM-DD')
        WHEN POSITION('/' IN DW_EFF_DT) > 0 THEN CAST(DW_EFF_DT AS DATE FORMAT 'MM/DD/YYYY')
        WHEN CHARACTERS(TRIM(DW_EFF_DT)) = 8 THEN CAST(DW_EFF_DT AS DATE FORMAT 'YYYYMMDD')
        WHEN CHARACTERS(TRIM(DW_EFF_DT)) = 5 THEN CAST(CAST('1899-12-30' AS DATE FORMAT 'YYYY-MM-DD') + CAST(DW_EFF_DT AS INTEGER) AS DATE FORMAT 'YYYY-MM-DD')
        ELSE NULL
    END AS DW_EFF_DT
    

    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.

Comments are closed.