TIME_SLICE
Introduced or updated: v1.2.799
TIME_SLICE 是一个标量函数,用于将单个日期/时间戳值映射到固定的日历间隔(slice 或 bucket)。
它返回包含该时间点的日历间隔的边界(起点或终点),常用于按自定义日历周期对时间序列数据进行分组、聚合和报告,例如按 2 周、3 个月或 15 分钟的窗口进行汇总。
语法
TIME_SLICE(<date_or_time_expr>, <slice_length>, <IntervalKind> [, <start_or_end>])
参数 | 描述 |
---|---|
<date_or_time_expr> | DATE、TIME、TIMESTAMP 或其他日期/时间表达式。返回类型尽可能与输入类型匹配。 |
<slice_length> | INTEGER >= 1。一个切片中连续的 IntervalKind 单元数(例如,对于 2 周的切片,值为 2)。 |
<IntervalKind> | 以下之一(不区分大小写):YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND。 |
<start_or_end> | 字符串 'START' 或 'END'(不区分大小写)。如果省略,默认为 'START'。 |
语义
-
对于给定的调用
TIME_SLICE(value, slice_length, IntervalKind, start_or_end)
:- START 返回切片开始的精确日历边界(包含)。
- END 返回紧随切片之后的边界(不包含的上界)。根据输入类型和系统精度,如果通过减去最小时间单位将其转换为包含的端点,END 也可以解释为切片可表示的最后一个瞬间。
-
支持的 IntervalKind 与输入类型:
- DATE 输入:YEAR、QUARTER、MONTH、WEEK、DAY。
- TIMESTAMP / TIMESTAMPTZ 输入:YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND(所有 IntervalKind 值)。
-
对齐规则(日历边界):
-
年从 1 月 1 日开始。
-
季度从季度边界开始(1 月 1 日、4 月 1 日、7 月 1 日、10 月 1 日)。
-
月从每月 1 日开始。
-
周根据实现的周约定进行对齐(默认使用周一作为一周的开始)。
-
天从 00:00:00 开始。
-
小时/分钟/秒的切片从这些单位的自然边界开始。
-
返回类型
- DATE 输入 → 返回 DATE。
- TIMESTAMP 输入 → 返回 TIMESTAMP。
示例
SELECT
'2019-02-28'::DATE AS "DATE",
TIME_SLICE("DATE", 4, 'MONTH', 'START') AS "start",
TIME_SLICE("DATE", 4, 'MONTH', 'END') AS "end";
╭──────────────────────────────────────╮
│ DATE │ start │ end │
├────────────┼────────────┼────────────┤
│ 2019-02-28 │ 2019-01-01 │ 2019-05-01 │
╰──────────────────────────────────────╯
CREATE OR REPLACE TABLE accounts (
id INT,
billing_date DATE,
balance_due DECIMAL(11, 2)
)
INSERT INTO
accounts (id, billing_date, balance_due)
VALUES
(1, '2018-07-31', 100.00),
(2, '2018-08-01', 200.00),
(3, '2018-08-25', 400.00);
-- 按 2 周的切片进行分组:
SELECT
TIME_SLICE(billing_date, 2, 'WEEK', 'START') AS slice_start,
TIME_SLICE(billing_date, 2, 'WEEK', 'END') AS slice_end,
COUNT(*) AS num_late_bills,
SUM(balance_due) AS total_due
FROM
accounts
WHERE
balance_due > 0
GROUP BY 1, 2
ORDER BY
total_due;
╭─────────────────────────────────────────────────────────────────────────────╮
│ slice_start │ slice_end │ num_late_bills │ total_due │
├────────────────┼────────────────┼────────────────┼──────────────────────────┤
│ 2018-07-23 │ 2018-08-06 │ 2 │ 300.00 │
│ 2018-08-20 │ 2018-09-03 │ 1 │ 400.00 │
╰─────────────────────────────────────────────────────────────────────────────╯
另请参阅
- DATE_TRUNC:提供类似的功能,但语法不同,以更好地兼容 SQL 标准。