TIME_SLICE
TIME_SLICE 是一个标量函数,用于将单个日期/时间戳值映射到固定的日历间隔(slice 或 bucket)。
它返回包含该时间点的日历区间的边界(起点或终点),通常用于按自定义日历周期对时间序列数据进行分组、聚合和报表,例如按 2 周、3 个月或 15 分钟窗口进行汇总。
语法
TIME_SLICE(<date_or_time_expr>, <slice_length>, <IntervalKind> [, <start_or_end>])
语义
对于给定调用 TIME_SLICE(value, slice_length, IntervalKind, start_or_end):
- START 返回该 slice 的精确日历边界起点(包含)。
- END 返回紧接在该 slice 之后的边界(排他的上界)。根据输入类型和系统精度,如果通过减去最小时间单位将其转换为包含式终点,END 也可以解释为该 slice 中最后一个可表示的时刻。
支持的 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 开始。
- Hour/Minute/Second slice 从这些单位的自然边界开始。
返回类型
- 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);
-- Group by 2-week slices:
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 标准兼容性。