¿Cómo usar DATEADD en una declaración de caso en Snowflake?
Tengo una tabla con una columna PERIOD_DAYS que está en varchar pero contiene muchos números. Tengo otra columna llamada FIRST_DATETIME, que está en tipo de datos datetime. Quiero agregar los números en PERIOD_DAYS a FIRST_DATETIME para obtener la fecha y hora final. Así que si datetime = ‘2020-01-01’ + 2 DÍAS, la final_datetime debería ser = ‘2020-01-03’.
Tengo una consulta que contiene una instrucción CASE, que dice que si el primer datetime ES NULL, entonces establecer la final_datetime predeterminada en 0. Sin embargo, sigo recibiendo un error.
Esto funciona:
select
ID,
PERIOD_DAYS,
FIRST_DATETIME,
DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME) as FINAL_DATETIME
from TBL_A a
group by ID,PERIOD_DAYS,FINAL_DATETIME
No funciona:
select
ID,
PERIOD_DAYS,
FIRST_DATETIME,
case when try_to_number(PERIOD_DAYS) IS NULL then 0 else DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME) END as FINAL_DATETIME
from TBL_A a
group by ID,PERIOD_DAYS,FINAL_DATETIME
Necesito que la segunda consulta funcione para tener en cuenta los valores no numéricos en las columnas de period_days.
davy.ai
El problema con la segunda consulta es que la sentencia CASE está evaluando la expresión para cada fila, incluyendo aquellas en las que PERIOD_DAYS puede convertirse a un número. Esto causa un error cuando try_to_number(PERIOD_DAYS) es NULL, ya que la función DATEADD espera un número válido de días para agregar.
Para solucionar esto, puedes mover la función try_to_number fuera de la sentencia CASE y usarla para crear una tabla temporal o subconsulta con los valores convertidos. Luego, puedes unir esta tabla temporal o subconsulta con la tabla original usando la columna ID, y usar los valores convertidos en el cálculo DATEADD.
Aquí tienes un ejemplo:
En este ejemplo, la función try_to_number se usa en una expresión de tabla común para crear una tabla temporal llamada converted_periods con dos columnas: ID y period_number. Luego, la consulta principal une esta tabla temporal con TBL_A usando la columna ID, y utiliza la columna period_number en el cálculo DATEADD dentro de la sentencia CASE. Esto garantiza que solo se incluyan en el cálculo de FINAL_DATETIME las filas con valores numéricos válidos para PERIOD_DAYS.
Ten en cuenta que eliminé FINAL_DATETIME de la cláusula GROUP BY, ya que se trata de una columna calculada y no es necesario agruparla explícitamente.