You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL条件替换列值求助:按Hours规则修改EndTime字段

解决基于条件替换时间列的SQL问题

嘿,我看你在处理时间列的条件替换时遇到了麻烦,咱们一步步来拆解问题并找到解决方案。

首先先明确你的场景和需求:

原始数据

StartTimeEndTimeHoursLocation
12:00:0000:30:005.5A
12:00:0000:30:00-4.5A
13:00:0001:20:00-6.5B
12:30:0004:06:00-12.1C
12:30:0004:06:00-12.1B
12:30:0004:06:00-12.1C

需求规则

  • 当 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,会得到符合预期的结果:

EndTimeHoursLocation
00:30:005.5A
12:30:00-4.5A
13:20:00-6.5B
12:30:00-12.1C
12:30:00-12.1B
12:30:00-12.1C

这样就完全匹配你的需求啦!

内容的提问来源于stack exchange,提问作者user14193972

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:42:48