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

关于在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:24:00