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
相关产品推荐
相关产品推荐

