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

SQL Server中StartDate无法将datetime转为date去除时间戳问题

问题根因

CASE表达式的返回数据类型由所有分支的最高优先级类型决定,当前代码中CASE的THEN分支直接返回ji.MADE字段,该字段为datetime/datetime2类型,优先级高于date类型,因此即使ELSE分支已经将结果转换为date类型,整个CASE表达式的返回结果仍会被隐式转换为datetime类型,自动补全00:00:00的时间戳。
EndDate没有出现该问题的原因是其为独立的子查询,直接返回date类型,不存在不同类型分支混合的场景,不会触发隐式类型转换。

解决方案

统一CASE所有分支的返回类型即可,有两种可选实现方式:

方案1:统一分支返回类型为date

将THEN分支的返回值也转换为date类型,保证两个分支类型完全对齐:

CASE 
    WHEN p.pname IN ('Compz') 
    THEN CONVERT(date, ji.MADE) -- 新增类型转换,和ELSE分支类型保持一致
    ELSE
    (SELECT MIN(CONVERT(date, MADE)) FROM changegroup cg1 INNER JOIN changeitem ci1 ON ci1.groupid = cg1.id
         WHERE ji.id = cg1.issueid AND CONVERT(nvarchar, ci1.NSTRING) IN ('Here','There')) 
END AS StartDate,
(SELECT MAX(CONVERT(date, MADE)) FROM changegroup cg1 INNER JOIN changeitem ci1 ON ci1.groupid = cg1.id
         WHERE ji.id = cg1.issueid AND CONVERT(nvarchar, ci1.NSTRING) IN ('1','2','3', '4')) AS EndDate,
re.pname AS resolution
FROM project p

方案2:将整个CASE结果转换为指定格式字符串

如果最终需要输出字符串格式的日期,可直接对整个CASE表达式的结果做格式转换:

CONVERT(varchar(10),
    CASE 
        WHEN p.pname IN ('Compz') 
        THEN ji.MADE
        ELSE
        (SELECT MIN(CONVERT(date, MADE)) FROM changegroup cg1 INNER JOIN changeitem ci1 ON ci1.groupid = cg1.id
             WHERE ji.id = cg1.issueid AND CONVERT(nvarchar, ci1.NSTRING) IN ('Here','There')) 
    END,
23) AS StartDate,
-- 此处EndDate代码保持不变即可

其中格式码23对应yyyy-MM-dd的输出格式,可根据需求更换为其他格式码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:54:01