如何获取经CONVERT()函数转换后的真实日期?
问题描述
原SQL查询语句如下:
SELECT i.owneridname, CONVERT(varchar, DATEADD(DD,-15,createdon),101) as createdon, COUNT(i.svb_contactname) AS [Yes], /* This is a conditional. It only shows non-null values*/ COUNT(*) - COUNT(i.svb_contactname) AS [No] /* COUNT(*) counts null and non-null, hence why the subtraction here works*/ FROM incident i WHERE i.svb_caseinitiatedfrom IN ('1', '2', '3', '4', '16', '17') AND i.svb_status_case IN ('1', '2', '12') GROUP BY i.owneridname, createdon ORDER BY [Yes] DESC;
查询结果中,CONVERT转换后的createdon是文本格式而非日期类型,导致尝试添加的筛选条件AND createdon >= DATEADD(DD,-15,createdon)无效,无法筛选出15天内的数据。
解决方案
核心原则是不要在筛选、分组阶段使用转换后的文本日期,需基于原始日期字段createdon完成逻辑处理,仅在最终输出时转换格式。
正确的SQL写法如下:
SELECT i.owneridname, CONVERT(varchar, DATEADD(DD,-15,i.createdon),101) AS formatted_createdon, COUNT(i.svb_contactname) AS [Yes], COUNT(*) - COUNT(i.svb_contactname) AS [No] FROM incident i WHERE i.svb_caseinitiatedfrom IN ('1', '2', '3', '4', '16', '17') AND i.svb_status_case IN ('1', '2', '12') -- 基于原始日期字段筛选近15天的数据 AND i.createdon >= DATEADD(DD, -15, GETDATE()) GROUP BY i.owneridname, i.createdon ORDER BY [Yes] DESC;
关键说明:
- 筛选逻辑用原始字段:
i.createdon >= DATEADD(DD, -15, GETDATE())通过原始日期和当前日期计算的15天前阈值做比较,确保筛选逻辑准确。 - 分组用原始字段:避免因文本格式的日期导致分组错误(比如同日期不同文本格式被拆分为不同组)。
- 输出时单独转换:将处理后的日期转成varchar格式并命名为
formatted_createdon,避免和原始字段混淆。
如果你的需求是将createdon减去15天后的日期作为筛选基准(比如筛选原始createdon减15天后仍在近15天内的数据),可调整WHERE条件为:
AND DATEADD(DD, -15, i.createdon) >= DATEADD(DD, -15, GETDATE()) -- 等价简化写法:AND i.createdon >= GETDATE()
内容的提问来源于stack exchange,提问作者hobosapien
相关产品推荐
相关产品推荐

