SQL条件替换列值求助:按Hours规则修改EndTime字段
解决基于条件替换时间列的SQL问题
嘿,我看你在处理时间列的条件替换时遇到了麻烦,咱们一步步来拆解问题并找到解决方案。
首先先明确你的场景和需求:
原始数据
| StartTime | EndTime | Hours | Location |
|---|---|---|---|
| 12:00:00 | 00:30:00 | 5.5 | A |
| 12:00:00 | 00:30:00 | -4.5 | A |
| 13:00:00 | 01:20:00 | -6.5 | B |
| 12:30:00 | 04:06:00 | -12.1 | C |
| 12:30:00 | 04:06:00 | -12.1 | B |
| 12:30:00 | 04:06:00 | -12.1 | C |
需求规则
- 当
Hours < 0且Hours <> -12.1时:把EndTime的AM时间转成PM时间(也就是加12小时) - 当
Hours = -12.1时:直接用StartTime替换EndTime - 其他情况(
Hours >= 0):保留原来的EndTime
你的代码问题分析
你写的第一个CASE语句逻辑有问题:
select case when Hours < 0 and Hours <> -12.1 then dateadd(hh, 12, EndTime) else StartTime end as EndTime, Hours, Location from myTable
这里的ELSE StartTime会把所有不满足第一个条件的行(包括Hours >= 0的正常行)都换成StartTime,这完全不符合你的需求——只有Hours = -12.1的行才需要替换成StartTime,其他情况应该保留原始的EndTime。
另外,如果你用的是MySQL这类数据库,DATEADD函数不适用,得换成ADDTIME,不过从你用convert(time, ...)来看,应该是SQL Server环境,咱们就基于这个来修正。
正确的SQL代码
你需要把三个情况明确拆分,用CASE语句依次处理:
SELECT CASE -- 处理Hours为负且不是-12.1的情况:给EndTime加12小时 WHEN Hours < 0 AND Hours <> -12.1 THEN DATEADD(hh, 12, EndTime) -- 处理Hours等于-12.1的情况:替换成StartTime WHEN Hours = -12.1 THEN StartTime -- 其他所有情况:保留原始EndTime ELSE EndTime END AS EndTime, Hours, Location FROM myTable
针对固定时间替换的修正
如果你想在不满足前两个条件时把EndTime换成固定值(比如12:30:00),只需要修改ELSE分支就行:
SELECT CASE WHEN Hours < 0 AND Hours <> -12.1 THEN DATEADD(hh, 12, EndTime) WHEN Hours = -12.1 THEN StartTime -- 其他情况替换为固定时间 ELSE CONVERT(TIME, '12:30:00') END AS EndTime, Hours, Location FROM myTable
测试结果验证
用你的原始数据跑第一个修正后的SQL,会得到符合预期的结果:
| EndTime | Hours | Location |
|---|---|---|
| 00:30:00 | 5.5 | A |
| 12:30:00 | -4.5 | A |
| 13:20:00 | -6.5 | B |
| 12:30:00 | -12.1 | C |
| 12:30:00 | -12.1 | B |
| 12:30:00 | -12.1 | C |
这样就完全匹配你的需求啦!
内容的提问来源于stack exchange,提问作者user14193972
相关产品推荐
相关产品推荐

