SQL如何基于Timediff时间差值创建条件生成输出1或0的新列
SQL实现时间差值的1/0标识列计算
需求说明
现有SQL查询已通过时间计算得到Difference_Start_Time(开始时间差值)、Difference_End_Time(结束时间差值)两列,需新增两列标识字段,判断规则为:差值>0时输出1,差值≤0时输出0,最终查询需按顺序返回共6列:
- Expected_Start_Time
- Actual_Start_Time
- Difference_Start_Time
- Difference_End_Time
- 开始时间1/0标识列
- 结束时间1/0标识列
通用实现方案(全主流数据库兼容)
使用标准SQL的CASE WHEN条件表达式即可实现,无需修改原有查询的关联、过滤逻辑,仅需在SELECT子句中新增两个判断字段即可,代码结构如下:
SELECT Expected_Start_Time, Actual_Start_Time, Difference_Start_Time, Difference_End_Time, -- 开始时间差值判断 CASE WHEN Difference_Start_Time > 0 THEN 1 ELSE 0 END AS Start_Time_Flag, -- 结束时间差值判断 CASE WHEN Difference_End_Time > 0 THEN 1 ELSE 0 END AS End_Time_Flag -- 下方直接保留你原有SQL的FROM、JOIN、WHERE、GROUP BY等逻辑即可 FROM 你的原有表关联与过滤逻辑
注意事项:如果
Difference_Start_Time、Difference_End_Time是同层SELECT中通过TIMEDIFF等函数计算得到的派生列,部分数据库不支持在同层SELECT直接引用列别名,此时可选择两种处理方式:
- 将判断逻辑中的列别名替换为你原本计算时间差值的完整表达式
- 将原有计算时间差值的逻辑封装到子查询或CTE中,在外层查询再做标识列的判断
上述示例中的
Start_Time_Flag、End_Time_Flag为标识列别名,可根据实际命名需求替换为自定义列名。
各数据库简化写法
不同数据库提供了更简洁的函数实现相同效果,可按需选用:
- MySQL/MariaDB:使用
IF()函数简化
SELECT Expected_Start_Time, Actual_Start_Time, Difference_Start_Time, Difference_End_Time, IF(Difference_Start_Time > 0, 1, 0) AS Start_Time_Flag, IF(Difference_End_Time > 0, 1, 0) AS End_Time_Flag FROM 你的原有查询逻辑
- PostgreSQL:支持布尔值直接转整数的简写
SELECT Expected_Start_Time, Actual_Start_Time, Difference_Start_Time, Difference_End_Time, (Difference_Start_Time > 0)::int AS Start_Time_Flag, (Difference_End_Time > 0)::int AS End_Time_Flag FROM 你的原有查询逻辑
- SQL Server:使用
IIF()函数简化
SELECT Expected_Start_Time, Actual_Start_Time, Difference_Start_Time, Difference_End_Time, IIF(Difference_Start_Time > 0, 1, 0) AS Start_Time_Flag, IIF(Difference_End_Time > 0, 1, 0) AS End_Time_Flag FROM 你的原有查询逻辑
内容的提问来源于stack exchange,提问作者Josh Anderson
相关产品推荐
相关产品推荐

