跳到主要内容

Interval

引入或更新于: v1.2.677

概览

INTERVAL 表示一段时间,可以用自然语言文本(如 '1 year 2 months''3 days ago')或微秒数的整数来表示。Databend 支持从千年到微秒的单位,并允许对区间、日期和时间戳进行算术运算。

备注

解析数值区间时会丢弃小数部分。'1.6 seconds' 会变成 1 秒的区间。

示例

字面量和数值

CREATE OR REPLACE TABLE intervals (duration INTERVAL);

INSERT INTO intervals VALUES
('1 year 2 months'), -- 正向自然语言
('1 year 2 months ago'), -- 负向,因为有 "ago"
('1000000'), -- 1 秒(微秒单位)
('-1000000'); -- -1 秒

SELECT TO_STRING(duration) AS duration_text FROM intervals;

结果:

┌──────────────────────┐
│ duration_text │
├──────────────────────┤
│ 1 year 2 months │
│ -1 year -2 months │
│ 0:00:01 │
│ -0:00:01 │
└──────────────────────┘
SELECT
TO_STRING(TO_INTERVAL('1 seconds')) AS whole,
TO_STRING(TO_INTERVAL('1.6 seconds')) AS fractional;

结果:

┌────────┬────────────┐
│ whole │ fractional │
├────────┼────────────┤
│ 0:00:01 │ 0:00:01 │
└────────┴────────────┘

区间运算

SELECT
TO_STRING(TO_DAYS(3) + TO_DAYS(1)) AS add_interval,
TO_STRING(TO_DAYS(3) - TO_DAYS(1)) AS subtract_interval;

结果:

┌──────────────┬──────────────────┐
│ add_interval │ subtract_interval │
├──────────────┼──────────────────┤
│ 4 days │ 2 days │
└──────────────┴──────────────────┘

应用于 DATE 和 TIMESTAMP

SELECT
DATE '2024-12-20' + TO_DAYS(2) AS add_days,
DATE '2024-12-20' - TO_DAYS(2) AS subtract_days,
TIMESTAMP '2024-12-20 10:00:00' + TO_HOURS(36) AS add_hours,
TIMESTAMP '2024-12-20 10:00:00' - TO_HOURS(36) AS subtract_hours;

结果:

┌────────────────────┬────────────────────┬────────────────────┬────────────────────┐
│ add_days │ subtract_days │ add_hours │ subtract_hours │
├────────────────────┼────────────────────┼────────────────────┼────────────────────┤
│ 2024-12-22T00:00:00 │ 2024-12-18T00:00:00 │ 2024-12-21T22:00:00 │ 2024-12-18T22:00:00 │
└────────────────────┴────────────────────┴────────────────────┴────────────────────┘

区间的加减运算就像数字一样,使得滑动窗口或计算偏移量变得容易,并且可以精确控制到微秒。

欢迎体验 Databend Cloud

基于 Rust + 对象存储构建的新一代多模态数仓,一个平台即可进行 BI、向量、全文检索及地理空间分析。

支持标准 SQL,自动弹性伸缩,助您快速构建现代化数据平台。

注册即领 ¥200 代金券。

注册体验