如何在雪花的案例陈述中使用 DATEADD?
How to use DATEADD in a case statement in snowflake?
我有一个 table,其列 PERIOD_DAYS 在 varchar 中,但包含很多数字。我还有一个名为 FIRST_DATETIME 的列,它是日期时间数据类型。我想将 PERIOD_DAYS 中的数字添加到 FIRST_DATETIME 以获得最终日期时间。因此,如果 datetime = '2020-01-01' + 2 DAYS,则 final_datetime 应该 = '2020-01-03'
我有一个包含 case 语句的查询,它表示如果 first_datetime 为 NULL,则将 final_datetime 默认为 0。但是,我一直收到错误消息。
这个有效:
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
无效:
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
我需要第二个查询来考虑 period_days 列中的非数字值。
您遇到的问题是因为您的 CASE 返回 0
,它在一个分支上是一个 NUMBER,在另一个分支上是 TIMESTAMP_NTZ。
这些不是兼容的类型。我建议使用 NULL 而不是零。
因此:
CASE WHEN try_to_number(PERIOD_DAYS) IS NULL THEN null
ELSE DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME)
END as FINAL_DATETIME
鉴于这只有 2 个分支,可以使用 IFF 代替:
IFF(try_to_number(PERIOD_DAYS) IS NULL, null, DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME) ) as FINAL_DATETIME
我有一个 table,其列 PERIOD_DAYS 在 varchar 中,但包含很多数字。我还有一个名为 FIRST_DATETIME 的列,它是日期时间数据类型。我想将 PERIOD_DAYS 中的数字添加到 FIRST_DATETIME 以获得最终日期时间。因此,如果 datetime = '2020-01-01' + 2 DAYS,则 final_datetime 应该 = '2020-01-03'
我有一个包含 case 语句的查询,它表示如果 first_datetime 为 NULL,则将 final_datetime 默认为 0。但是,我一直收到错误消息。
这个有效:
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
无效:
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
我需要第二个查询来考虑 period_days 列中的非数字值。
您遇到的问题是因为您的 CASE 返回 0
,它在一个分支上是一个 NUMBER,在另一个分支上是 TIMESTAMP_NTZ。
这些不是兼容的类型。我建议使用 NULL 而不是零。
因此:
CASE WHEN try_to_number(PERIOD_DAYS) IS NULL THEN null
ELSE DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME)
END as FINAL_DATETIME
鉴于这只有 2 个分支,可以使用 IFF 代替:
IFF(try_to_number(PERIOD_DAYS) IS NULL, null, DATEADD('days',try_to_number(PERIOD_DAYS), FIRST_DATETIME) ) as FINAL_DATETIME