编写CASE WHEN语句实现指定日期起工时字段加6小时
代码问题分析与修正
你写的代码存在几个明显问题,不能直接使用:
- 第一个CASE语句判断的是
punch_start的时间范围,但返回的却是punch_end的计算结果,字段混淆了,应该针对punch_start本身做处理。 - 三个字段的判断逻辑不统一:
punch_start用自身做条件,punch_end和punch_time_list却用punch_end做条件,会导致同一条记录可能出现部分字段加6小时、部分不加的混乱情况(比如某条记录punch_start在2022-06-24,punch_end在2022-06-25)。 dateadd(hour, 0, xxx)完全多余,直接返回原字段即可,没必要做无意义的时间加法。
修正后的代码(统一用punch_start作为判断条件,匹配你“2022-06-25及之后的记录执行加6小时”的需求)
-- 处理punch_start字段 (case when punch_start >= '2022-06-25 00:00:00.000' then dateadd(hour, 6, cast(punch_start as datetime)) else cast(punch_start as datetime) end) as punch_start, -- 处理punch_end字段 (case when punch_start >= '2022-06-25 00:00:00.000' then dateadd(hour, 6, cast(punch_end as datetime)) else cast(punch_end as datetime) end) as punch_end, -- 处理punch_time_list字段 (case when punch_start >= '2022-06-25 00:00:00.000' then cast(dateadd(hour, 6, cast(punch_start as time(0))) as nvarchar) + ' - ' + cast(dateadd(hour, 6, cast(punch_end as time(0))) as nvarchar) else cast(cast(punch_start as time(0)) as nvarchar) + ' - ' + cast(cast(punch_end as time(0)) as nvarchar) end) as punch_time_list,
补充说明
如果业务逻辑是只要punch_end在2022-06-25及之后就加6小时,只需把所有判断条件里的punch_start换成punch_end,保证三个字段的判断逻辑一致即可。另外,如果原字段本身就是datetime类型,cast(xxx as datetime)可以直接去掉,用dateadd(hour,6,punch_start)更简洁。
内容的提问来源于stack exchange,提问作者Work PowerBI2022
相关产品推荐
相关产品推荐

