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.

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

Tags:  , ,

Answer

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

    with converted_periods as (
      select ID, try_to_number(PERIOD_DAYS) as period_number
      from TBL_A
    )
    
    select a.ID, a.PERIOD_DAYS, a.FIRST_DATETIME,
      case when b.period_number is null then 0
           else DATEADD('days', b.period_number, a.FIRST_DATETIME) END as FINAL_DATETIME
    from TBL_A a
    left join converted_periods b on a.ID = b.ID
    group by a.ID, a.PERIOD_DAYS, a.FIRST_DATETIME, b.period_number
    

    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.

Comments are closed.