跳到主要内容

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";

╭──────────────────────────────────────╮
DATEstartend
├────────────┼────────────┼────────────┤
2019-02-282019-01-012019-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-232018-08-062300.00
2018-08-202018-09-031400.00
╰─────────────────────────────────────────────────────────────────────────────╯

另请参阅

  • DATE_TRUNC:提供类似的功能,但语法不同,以更好地兼容 SQL 标准。
开始使用 Databend Cloud
低成本
快速分析
多种数据源
弹性扩展
注册