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

如何获取经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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:07:27