【问题标题】:Nested case statements Teradata converting timestamp(0),timestamp(6) to date and compare嵌套案例语句 Teradata 将时间戳(0)、时间戳(6)转换为日期并进行比较
【发布时间】:2020-09-08 23:59:57
【问题描述】:
  I want to generate qualify_flag as '1' always when device_end_dt = '9999-12-31 23:29:59'. If it is 
 not '9999-12-31 23:29:59' then if DEVICE_END_DT + 1 day = CREATION_DATE then qualify_flag is 0 else 1. 
DEVICE_END_DT is TIMESTAMP(0), CREATION_DATE  is TIMESTAMP(6). 
CREATION_DATE column doesn't have any value which is '9999-12-31'.

以下 case 语句因日期无效而失败,似乎 '9999-12-31' 以某种方式出现,而 ('9999-12-31' + 1) 则模棱两可。

select
case When 
        Cast(DEVICE_END_DT AS DATE) <> CAST('9999-12-31' AS DATE) 
            THEN
                case when CAST((Cast(DEVICE_END_DT AS DATE) + 1) AS DATE) = Cast(CREATION_DATE AS DATE)
                        then 0
                        else 1
                end

case when   
        Cast(DEVICE_END_DT AS DATE) = CAST('9999-12-31' AS DATE) 
            THEN
                            1 
end 
end as qualify_flag
 FROM ABC;

【问题讨论】:

    标签: sql switch-statement case teradata teradata-sql-assistant


    【解决方案1】:

    这是您的逻辑简化:

    CASE 
      WHEN Cast(DEVICE_END_DT AS DATE) = Cast(CREATION_DATE AS DATE) - 1
      THEN 0
      ELSE 1
    END
    

    顺便说一句,最好使用 日期文字 DATE '9999-12-31' 而不是 CAST('9999-12-31' AS DATE)

    您要解决的最后一个业务问题是什么?看起来像是在缓慢变化的维度中识别不良数据。

    【讨论】:

    • 谢谢迪特。是的,你是对的。上面的查询工作正常,只是删除了额外的大括号。
    猜你喜欢
    • 2018-02-10
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 2020-10-19
    • 2020-07-06
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多