SQL - DATE_BUCKET() 函数



SQL 的 DATE_BUCKET() 函数允许您将数据分组到对应于固定时间段的组中。根据提供给函数的参数,它返回标记每个日期时间存储桶开始的日期时间值。

日期存储桶函数顾名思义,计算具有单个定义大小的日期存储桶。如果向函数提供日期和存储桶大小,则该函数将返回保存该日期的存储桶的起始日期。

语法

以下是 SQL DATE_BUCKET() 函数的语法:

DATE_BUCKET (datepart, number, date, origin)

参数

此函数接受四个参数。下面将讨论相同的参数:

  • datepart − 用于与数字一起使用的日期部分。例如,年、分钟、小时等。

  • number − 这是一个整数,它将决定与 datepart 参数组合的存储桶宽度。它应该是一个正整数,因为它表示从原点时间开始的 datepart 存储桶的宽度。

  • date − DATE_BUCKET 接受表达式、列表达式或用户定义的日期变量,如果它们解析为以下任何数据类型,例如 date、datetime、datetime2、datetimeoffset、smalldatetime、time。

  • origin − 原点数据类型应与日期参数的数据类型匹配。如果未为函数指定原点值,则 DATE_BUCKET 使用默认原点日期值。

示例

让我们来看一下 SQL DATE_BUCKET() 函数的以下示例,其中宽度为 1 天,使用以下查询:

DECLARE @date date = '2023-02-21',
@origin date = '2023-02-05';
SELECT DATE_BUCKET(DAY, 1, @date, @origin);

输出

当我们执行上面的查询时,输出如下:

+------------+
| Result     |
+------------+
| 2023-02-21 |
+------------+

示例

这是另一种情况,我们将使用以下查询分别将参数递增到 2、3、4:

DECLARE @date date = '2023-02-21',
@origin date = '2023-02-05';
SELECT 
   DATE_BUCKET(day, 1, @date, @origin) AS "1 day",
   DATE_BUCKET(day, 2, @date, @origin) AS "2 days",
   DATE_BUCKET(day, 3, @date, @origin) AS "3 days",
   DATE_BUCKET(day, 4, @date, @origin) AS "4 days";

输出

查询执行后,将生成如下所示的输出:

+------------+------------+------------+------------+
| 1day       | 2 days     | 3 days     | 4 days     |
+------------+------------+------------+------------+
| 2023-02-21 | 2023-02-21 | 2023-02-20 | 2023-02-21 |
+------------+------------+------------+------------+

示例

在下面的示例中,我们将设置一个 7 天的宽度,但是 @date 和 @origin 之间只剩下 5 天了,让我们看看使用以下查询的结果:

DECLARE 
   @date date = '2023-02-21',
   @origin date = '2023-02-17';
SELECT DATE_BUCKET(day, 7, @date, @origin) AS OriginDate;

输出

执行上述查询后,输出将显示如下:

+------------+
| OriginDate |
+------------+
| 2023-02-17 |
+------------+

示例

让我们来看另一个场景,我们将使用 7 天的宽度,并增加两个日期之间的间隔,并使用以下查询检查结果:

DECLARE 
   @date date = '2023-02-21',
   @origin date = '2023-02-10';
SELECT DATE_BUCKET(day, 7, @date, @origin) AS Result;

输出

当查询执行时,将生成如下所示的输出:

+------------+
| Result     |
+------------+
| 2023-02-17 |
+------------+

示例

让我们来看另一个示例,我们将使用用户定义的变量作为 number 和 date 的参数,并通过运行以下查询来检查结果:

DECLARE @days int = 365,
        @datetime datetime2 = '2023-02-21 18:03:59.8684429';;
SELECT Date_Bucket(DAY, @days, @datetime) AS Result;

输出

上面查询的输出如下所示:

+-----------------------------+
| Result                      |
+-----------------------------+
| 2022-12-02 00:00:00.0000000 |
+-----------------------------+

示例

在下面的示例中,我们将使用 SYSDATETIME() 作为日期,使用以下查询:

SELECT Date_Bucket(WEEK, 08, SYSDATETIME()) AS Result;

输出

查询执行后,将生成如下所示的输出:

+-----------------------------+
| Result                      |
+-----------------------------+
| 2023-02-13 00:00:00.0000000 |
+-----------------------------+

示例

这是另一种情况,我们将使用 SYSDATETIME() 和数字表达式 (07/2) 作为 number 和 date 的参数,使用以下查询:

SELECT Date_Bucket(WEEK,(07/2), SYSDATETIME()) AS Result;

输出

运行上述查询后,将生成如下所示的输出:

+-----------------------------+
| Result                      |
+-----------------------------+
| 2023-02-06 00:00:00.0000000 |
+-----------------------------+

示例

考虑以下示例,我们将使用非默认原点值来生成 date_bucket,使用以下查询:

Declare @date datetime2 = '2023-02-21 11:34:22';
declare @origin datetime2 = '2023-01-01 00:00:00';
Select DATE_BUCKET(HOUR, 3, @date, @origin) AS Result;

输出

运行上述查询后,将生成如下所示的输出:

+-----------------------------+
| Result                      |
+-----------------------------+
| 2023-02-21 09:00:00.0000000 |
+-----------------------------+
sql-date-functions.htm
广告