SQL DATE_BUCKET() 函数
SQL 的 DATE_BUCKET() 函数可以将数据分组成对应于固定时间段的组。根据函数提供的参数,它返回标记每个日期桶开始的日期时间值。
正如其名称所示,Date Bucket 函数计算具有单个定义大小的日期桶。如果提供了日期和桶大小,函数将返回包含该日期的桶的起始日期。
语法
SQL DATE_BUCKET() 函数的语法如下 –
DATE_BUCKET (datepart, number, date, origin)
参数
此函数接受四个参数。以下是详细讨论:
- datepart - 与数字一起使用的日期部分。例如,年、分钟、小时等。
-
number - 一个整数,用于决定与datepart参数组合的桶的宽度。它应该是一个正整数值,因为它代表日期部分桶的宽度,从原始时间起计算。
-
date - DATE_BUCKET接受一个表达式、列表达式或用户定义变量作为日期,如果它们解析为以下数据类型之一,如date、datetime、datetime2、datetimeoffset、smalldatetime、time。
-
origin - 原始数据类型应与日期参数的数据类型匹配。如果没有为函数指定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 |
+------------+
示例
让我们看另一个例子,在这个例子中,我们将使用用户定义的变量作为数字、日期的参数,并通过运行以下查询来检查结果:
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)作为数值和日期的参数。
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 |
+-----------------------------+