一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

SQL Server 2022 新函数之DATETRUNC 日期截断完整指南

时间:2026-09-02 10:34:01 编辑:袖梨 来源:一聚教程网

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“SQL Server 2022 新函数之DATETRUNC 日期截断”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

前言

DATETRUNC 是 SQL Server 2022 引入的日期截断函数,能够将日期/时间值截断到指定的精度(如截断到年、月、周、日、小时等)。在统计报表、时间分组等场景中很实用,比以前用 CONVERTDATEADDDATEDIFF 组合实现的写法简洁得多。

语法

DATETRUNC ( datepart, date )
参数说明
datepart截断精度,兼容:year、quarter、month、week、iso_week、dayofyear、day、hour、minute、second、millisecond、microsecond、nanosecond
date在这个场景下,日期/时间表达式,兼容 date、time、datetime、datetime2、datetimeoffset、smalldatetime

得到值:与输入参数相同的数据类型,小于截断精度的部分全部归零。

CREATE TABLE #Orders (
    OrderID INT,
    CustomerID INT,
    OrderDate DATETIME2,
    Amount DECIMAL(10, 2)
)
INSERT INTO #Orders VALUES
(1, 101, '2024-03-15 09:32:47.123', 1500.00),
(2, 102, '2024-03-15 14:05:22.456', 800.00),
(3, 101, '2024-03-20 11:18:33.789', 2300.00),
(4, 103, '2024-04-02 08:55:01.234', 620.00),
(5, 102, '2024-04-18 16:44:59.567', 1100.00),
(6, 101, '2024-05-07 10:22:15.890', 3200.00),
(7, 103, '2024-05-25 13:30:45.123', 950.00),
(8, 102, '2024-06-10 09:15:30.456', 1750.00)

一、按日截断(去掉时间部分)

SELECT 
    OrderID,
    OrderDate,
    DATETRUNC(day, OrderDate) AS 截断到日
FROM #Orders

结果:

OrderIDOrderDate截断到日
12024-03-15 09:32:47.1232024-03-15 00:00:00
22024-03-15 14:05:22.4562024-03-15 00:00:00
32024-03-20 11:18:33.7892024-03-20 00:00:00
.........

老写法对比:CONVERT(DATE, OrderDate)CAST(OrderDate AS DATE),注意 DATETRUNC 保留原始数据类型(得到 DATETIME2),而不是转为 DATE 类型。

二、按月截断(统计月度数据)

-- 按月汇总销售额
SELECT
    DATETRUNC(month, OrderDate) AS 月份,
    COUNT(*) AS 订单数,
    SUM(Amount) AS 总金额
FROM #Orders
GROUP BY DATETRUNC(month, OrderDate)
ORDER BY 月份

结果:

月份订单数总金额
2024-03-01 00:00:0034600.00
2024-04-01 00:00:0021720.00
2024-05-01 00:00:0024150.00
2024-06-01 00:00:0011750.00

老写法对比:

-- 以前的写法,需要组合多个函数
GROUP BY DATEADD(month, DATEDIFF(month, 0, OrderDate), 0)
-- 或者
GROUP BY YEAR(OrderDate), MONTH(OrderDate)

DATETRUNC 写法更直观,且结果直接是 DATETIME2 类型,可用来后续日期计算。

三、按季度截断

SELECT 
    DATETRUNC(quarter, OrderDate) AS 季度起始日,
    COUNT(*) AS 订单数,
    SUM(Amount) AS 总金额
FROM #Orders
GROUP BY DATETRUNC(quarter, OrderDate)
ORDER BY 季度起始日

结果:

季度起始日订单数总金额
2024-01-01 00:00:0056320.00
2024-04-01 00:00:0033800.00

四、按周截断(ISO 周,周一为第一天)

SELECT 
    OrderID,
    OrderDate,
    DATETRUNC(week, OrderDate) AS 本周起始_周日,
    DATETRUNC(iso_week, OrderDate) AS 本周起始_周一
FROM #Orders
  • week:以周日为每周第一天(受 DATEFIRST 设置影响)
  • iso_week:以周一为每周第一天(ISO 8601 标准,不受 DATEFIRST 影响)

建议业务场景中优先采用 iso_week,结果更可预期。

五、按小时截断(适合流量/日志分析)

SELECT 
    OrderID,
    OrderDate,
    DATETRUNC(hour, OrderDate) AS 截断到小时,
    DATETRUNC(minute, OrderDate) AS 截断到分钟
FROM #Orders

结果:

OrderIDOrderDate截断到小时截断到分钟
12024-03-15 09:32:47.1232024-03-15 09:00:002024-03-15 09:32:00
22024-03-15 14:05:22.4562024-03-15 14:00:002024-03-15 14:05:00

六、与 DATEDIFF 结合:计算距本月初的天数

SELECT 
    OrderID,
    OrderDate,
    DATEDIFF(day, DATETRUNC(month, OrderDate), OrderDate) AS 当月第几天
FROM #Orders

结果:

OrderIDOrderDate当月第几天
12024-03-15 09:32:47.12314
42024-04-02 08:55:01.2341
62024-05-07 10:22:15.8906

七、兼容的 datepart 汇总

datepart示例输入截断结果
year2024-03-15 09:322024-01-01 00:00
quarter2024-05-15 09:322024-04-01 00:00
month2024-03-15 09:322024-03-01 00:00
week2024-03-15(周五)2024-03-10(本周周日)
iso_week2024-03-15(周五)2024-03-11(本周周一)
day2024-03-15 09:32:472024-03-15 00:00:00
hour2024-03-15 09:32:472024-03-15 09:00:00
minute2024-03-15 09:32:472024-03-15 09:32:00
second2024-03-15 09:32:47.1232024-03-15 09:32:47

兼容性说明

版本兼容情况
SQL Server 2022 及以上 兼容
SQL Server 2019 及以下 不兼容
Azure SQL Database 兼容(2022年4月起)

总结

DATETRUNC 填补了 SQL Server 长期以来缺少日期截断专用函数的空白。以前需 DATEADD + DATEDIFF 组合才能实现的逻辑,现在一个函数搞定:

  • 统计报表按年/月/季度/周分组:GROUP BY DATETRUNC(month, 日期列)
  • 去除时间部分:DATETRUNC(day, 日期列)(保留原类型,不变成 DATE)
  • 日志分析按小时/分钟汇总:GROUP BY DATETRUNC(hour, 日期列)

简洁、直观,建议在 SQL Server 2022 环境中替换老写法。

到此这篇关于SQL Server 2022 新函数之DATETRUNC 日期截断详解的文章就介绍到这了,更多相关SQL Server DATETRUNC 日期内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!

您可能感兴趣的文章:
  • Oracle数据的插入insert、更新update、删除delete、truncate举例详解
  • PostgreSQL中date_trunc函数的语法及一些示例
  • SQL Server日期时间加减函数(DATEDIFF、DateAdd)的采用
  • SQL Server中日期时间函数的用法详解
  • SQL Server日期加减函数DATEDIFF与DATEADD用法分析
  • SQL Server 日期函数CAST 和 CONVERT 以及在业务中的采用介绍
  • SQLserver中用convert函数转换日期格式的方法
  • SqlServer中的日期与时间函数
  • Sqlserver 常用日期时间函数

热门栏目