如何在SELECT语句中使用CASE语句 解决DATEDIFF空值替换及CAST语法报错问题
SQL报错修复方案
核心错误点
CAST语法缺失AS 目标数据类型声明,不符合SQL语法要求- 逻辑冲突:同一返回列不能同时存在字符串和数值/时间类型值,必须统一数据类型
- 额外语法问题:原代码CASE结构不完整,仅声明了NULL分支的返回值,缺少非NULL场景的处理逻辑,还多了多余的逗号
修复后可运行代码
SELECT concat(e.firstname, e.lastname) as Fullname, c.shiftcode as Shift, cast(c.datecheckinout as date) Date, datename(month, c.datecheckinout) as RecordMonth, c.timein, c.timeout, CASE WHEN DATEDIFF(HOUR, c.timein, c.timeout) IS NULL THEN 'No record' ELSE CAST(DATEDIFF(HOUR, c.timein, c.timeout) AS VARCHAR(20)) END AS WorkDurationHours FROM tblCheckInOutDetail c RIGHT JOIN tblEmployee e ON e.IdEmployee = c.IdEmployee WHERE e.IdEmployee = 55
说明
- 直接在CASE分支内做类型统一:非NULL场景下把DATEDIFF返回的整数小时差转为字符串,和
No record的字符串类型匹配 - 你可以根据实际需求修改
WorkDurationHours别名,或者调整DATEDIFF的单位计算逻辑 - 如果需要返回时间格式而非时长差值,只需将ELSE分支的转换逻辑替换为对应时间转字符串的语法即可,只要保证整个CASE返回的所有值类型一致就不会报错
内容的提问来源于stack exchange,提问作者John Phillip Abello
相关产品推荐
相关产品推荐

