sql - 嵌套案例语句 Teradata 将时间戳(0)、时间戳(6)转换为日期并进行比较
问题描述
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;
解决方案
这是您简化的逻辑:
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)
.
您要解决的最终业务问题是什么?看起来像是在缓慢变化的维度中识别不良数据。
推荐阅读
- php - 使用前端控制器时在同一控制器上显示 Ajax 调用值
- html - 缩放 Svg 而不拉伸其中的一部分
- php - Laravel 无法在 eloquent 创建事件上设置 id
- windows - 扩展 Windows 安全模型
- tvos13 - 使用用 Xcode 11 编译的 tvOS 13 UITabBarController - tabBarObservedScrollView 滚动内容
- scala - 将两个列表与一个不同的元素组合在一起
- php - Laravel如何自动获取数组ID
- angular - Angular 如何使用 combineLatest 组合来自网站 url 栏的路由和查询
- npm - 如何在创建新的 Angular 8 项目时修复此 json 错误
- java - Drools 在 camelCase 中查找 Java 类,引发 NoClassDefFoundError