datetrunc是sql server 2022唯一原生支持向下截断到时间起点的函数,支持year至nanosecond全小写全称datepart,不支持缩写及weekday等;week依@@datefirst,iso_week严格遵循iso 8601;group by需完全匹配表达式,where中避免函数包裹字段以防索引失效。

DATETRUNC 是 SQL Server 2022 唯一原生支持「向下截断到时间起点」的函数,它不四舍五入、不偏移、不依赖时区设置,直接把输入时间归零到指定粒度的起始点。
DATETRUNC 的 datepart 参数哪些能用、哪些会报错
SQL Server 对 datepart 的校验非常严格,拼写错误或使用不支持的值会直接报错 Incorrect syntax near ',' 或 Invalid datepart。
- ✅ 支持的完整列表(大小写不敏感):
year、quarter、month、week、iso_week、day、hour、minute、second、millisecond、microsecond、nanosecond - ❌ 明确不支持:
weekday、dayofyear(虽然文档里提了,但实际行为等同day,且不能作为独立截断单位)、timezoneoffset - ⚠️ 缩写如
yy、mm、dd在 DATETRUNC 中不被接受——这是和 DATEPART 的关键区别,必须写全称
按周/ISO周截断时,week 和 iso_week 的行为差异
两者都返回「该周第一天」,但基准不同,结果可能差整整一天:
-
DATETRUNC(week, '2026-09-04'):按当前@@DATEFIRST设置算。默认为 7(星期日),所以返回2026-08-30 00:00:00(周日) -
DATETRUNC(iso_week, '2026-09-04'):强制 ISO 8601 标准(周一为每周第一天),返回2026-08-31 00:00:00(周一) - 跨年边界要注意:比如
'2026-01-01'属于 2025 年第 53 周(ISO),DATETRUNC(iso_week, '2026-01-01')实际返回的是2025-12-29,不是2026-01-01
GROUP BY 中用 DATETRUNC 必须注意的三件事
很多人写了 SELECT DATETRUNC(month, order_date) AS m, COUNT(*) 却在 GROUP BY 里只写 order_date,结果报错或分组错乱。
- GROUP BY 表达式必须和 SELECT 中的
DATETRUNC(...)函数调用完全一致,包括参数顺序、大小写、空格(虽通常忽略,但建议统一) - 如果字段是
datetimeoffset,DATETRUNC返回的仍是datetimeoffset,但精度保留;若想按本地时间分组,得先用AT TIME ZONE转换,再截断,例如:DATETRUNC(month, order_time AT TIME ZONE 'China Standard Time') - 别在 WHERE 中对字段套
DATETRUNC,比如WHERE DATETRUNC(day, order_date) = '2026-09-04'—— 这会让索引失效;应改写为:WHERE order_date >= '2026-09-04' AND order_date
和 DATE_BUCKET 混用时容易忽略的类型兼容性
DATETRUNC 和 DATE_BUCKET 都是 SQL Server 2022 新增函数,但设计目标不同:前者对齐起点,后者划分固定宽度桶。混用时最容易翻车的是返回类型隐式转换。
-
DATETRUNC(day, GETDATE())返回datetime2(7);DATE_BUCKET(day, 1, '2020-01-01', GETDATE())也返回datetime2(7),可安全比较 - 但
DATE_BUCKET(hour, 5, '2020-01-01', GETDATE())返回的是每 5 小时一桶的起点,而DATETRUNC(hour, GETDATE())是每小时一桶——两者数值不相等,也不能直接JOIN ON a = b - 最关键一点:
DATE_BUCKET的第三个参数startdate必须是常量或确定性表达式,不能是列值;而DATETRUNC不需要这个参数,更轻量
真正难处理的不是语法,而是当你需要把「某天 14:30 的订单」归到「当天营业时段(9:00–18:00)」这类非标准周期时,DATETRUNC 无能为力——它只认日历单位,不认业务规则。这时候得回到 DATEADD + DATEDIFF 组合,或者用 CASE 手动映射。










