关于在SQL CASE表达式中输出指定日期格式的技术咨询
解决CASE WHEN中日期格式化与Fallback查询的问题
我理解你的需求是要在CASE WHEN语句里实现这样的逻辑:
- 当
E.A_EXTTRNDTETME字段不为空时,将其格式化为YYYYMMDD-HH:MM:SS.XXX格式的字符串 - 当该字段为空时,从
T_ATH_EXE表中筛选出符合A_PAREXEID = E.A_EXEID条件的第一条A_EXTTRNDTETME(按A_ADDDTETME排序),同样要输出目标格式 - 最后留一个兜底分支返回
'text'
问题分析
你的原SQL有个小细节需要注意:子查询里直接返回了A_EXTTRNDTETME字段,没有做和主分支一样的格式化处理,这样会导致两种场景下返回的格式不一致。另外,E.A_EXTTRNDTETME只有非空和空两种状态,所以ELSE分支实际上永远不会被触发,不过如果需要保留冗余逻辑也没问题。
优化后的SQL代码
下面是修正了格式一致性问题的版本,同时保留了你原本使用的字符串拼接方式:
CASE WHEN E.A_EXTTRNDTETME IS NOT NULL THEN LEFT(E.A_EXTTRNDTETME, 4) + '-' + SUBSTRING(E.A_EXTTRNDTETME, 5, 2) + '-' + SUBSTRING(E.A_EXTTRNDTETME, 7, 2) + ' ' + SUBSTRING(E.A_EXTTRNDTETME, 9, 2) + ':' + SUBSTRING(E.A_EXTTRNDTETME, 11, 2) + ':' + SUBSTRING(E.A_EXTTRNDTETME, 13, 2) + '.' + SUBSTRING(E.A_EXTTRNDTETME, 15, 3) WHEN E.A_EXTTRNDTETME IS NULL THEN ( SELECT TOP 1 LEFT(A_EXTTRNDTETME, 4) + '-' + SUBSTRING(A_EXTTRNDTETME, 5, 2) + '-' + SUBSTRING(A_EXTTRNDTETME, 7, 2) + ' ' + SUBSTRING(A_EXTTRNDTETME, 9, 2) + ':' + SUBSTRING(A_EXTTRNDTETME, 11, 2) + ':' + SUBSTRING(A_EXTTRNDTETME, 13, 2) + '.' + SUBSTRING(A_EXTTRNDTETME, 15, 3) FROM T_ATH_EXE WHERE A_PAREXEID = E.A_EXEID ORDER BY A_ADDDTETME ) ELSE 'text' -- 此分支不会触发,可根据需要保留或删除 END AS FormattedDateTime
更简洁的替代方案(基于SQL Server)
如果你的数据库是SQL Server,并且A_EXTTRNDTETME是datetime/datetime2类型,可以用FORMAT函数简化格式化逻辑,避免手动拼接字符串:
CASE WHEN E.A_EXTTRNDTETME IS NOT NULL THEN FORMAT(E.A_EXTTRNDTETME, 'yyyyMMdd-HH:mm:ss.fff') WHEN E.A_EXTTRNDTETME IS NULL THEN ( SELECT TOP 1 FORMAT(A_EXTTRNDTETME, 'yyyyMMdd-HH:mm:ss.fff') FROM T_ATH_EXE WHERE A_PAREXEID = E.A_EXEID ORDER BY A_ADDDTETME ) ELSE 'text' END AS FormattedDateTime
注意事项
- 如果
A_EXTTRNDTETME是字符串类型,要确保它的长度和格式符合预期(比如是17位的YYYYMMDDHHmmssXXX格式),否则SUBSTRING可能会报错或返回异常结果 - 子查询中的
TOP 1配合ORDER BY能确保返回的是符合条件的第一条记录,如果你需要最新或最旧的记录,调整ORDER BY的排序方向即可
内容的提问来源于stack exchange,提问作者mwhite110
相关产品推荐
相关产品推荐

