SQL Server 2022 RTM及多数CU版本不支持DATETRUNC函数,执行会报错;替代方案:日期级用DATEFROMPARTS+DATEPART,小时级及以上用DATEADD+DATEDIFF;可通过sys.all_objects验证是否可用。

DATETRUNC 在 SQL Server 2022 中是否可用?
不能直接用。SQL Server 2022 **不支持** DATETRUNC 函数——这是 Azure SQL Database 和 SQL Server 2022(仅限某些预览版或特定 CU 后的版本)后期才逐步引入的功能,但**正式发布的 SQL Server 2022 RTM(16.0.1000.6)及多数常见 CU 版本中仍无此函数**。如果你执行 DATETRUNC,会收到错误:Invalid column name 'DATETRUNC' 或 ‘DATETRUNC’ is not a recognized built-in function name。
替代方案:用 DATEFROMPARTS + DATEPART 模拟 DATETRUNC 行为
要实现类似 DATETRUNC(day, getdate())(即清空时分秒,保留日期)的效果,最稳定、兼容性最好的方式是组合 DATEPART 和 DATEFROMPARTS:
SELECT DATEFROMPARTS( DATEPART(YEAR, GETDATE()), DATEPART(MONTH, GETDATE()), DATEPART(DAY, GETDATE()) ) AS truncated_date;
这个写法适用于 year、quarter、month、day 级别截断。注意:
-
DATEFROMPARTS要求所有参数非 NULL,所以不能直接用于hour或minute级别(它不接受时/分/秒参数) - 若需截断到
hour,得改用DATEADD+DATEDIFF组合 - 该方法在 SQL Server 2012+ 全系列都可用,比依赖新函数更可靠
截断到小时/分钟:必须用 DATEADD + DATEDIFF
对 hour、minute、second 这类时间粒度,DATEFROMPARTS 不适用,正确姿势是:
-- 截断到小时(清空分秒) SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, GETDATE()), 0); <p>-- 截断到分钟(清空秒毫秒) SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, GETDATE()), 0);
原理是:先算出目标单位(如 HOUR)与基准时间(0 即 1900-01-01 00:00:00)之间的整数差,再把这差值加回基准时间。关键点:
- 第二个参数必须是常量时间字面量(如
0或'19000101'),不能是变量,否则可能引发隐式转换问题 - 不要写成
DATEDIFF(HOUR, GETDATE(), 0)——顺序反了结果会是负数,导致截断失败 - 这种写法在 SQL Server 2005+ 就已存在,性能好、无兼容性风险
如何确认你当前实例是否真支持 DATETRUNC?
别信文档标题或安装版本号,直接查系统函数视图:
SELECT * FROM sys.all_objects WHERE name = 'DATETRUNC' AND type = 'FN';
如果没返回任何行,说明函数不可用。另外可运行:
SELECT @@VERSION;
检查输出中是否包含类似 SQL Server 2022 (RTM-CUxx) 的字样,并对照 官方文档更新日志确认 CU 版本是否已包含该功能。目前(2024 年中)绝大多数生产环境仍处于不支持状态。
实际使用时,优先按兼容写法组织逻辑,等明确升级到支持版本后再渐进替换——毕竟时间截断逻辑一旦嵌入大量报表或 ETL 脚本,改起来远比想象中麻烦。

















