0Pricing
SQL Academy · 课时

日期运算与 INTERVAL

使用 INTERVAL 加减日期、计算时长,并构建“最近 7 天”等相对日期过滤条件。

日期运算与 INTERVAL 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

日期和时间类型回顾

PostgreSQL 中的四种核心时间类型:

  • DATE — 日历日期,不含时间
  • TIME — 一天中的时间
  • TIMESTAMP — 日期 + 时间,不含时区
  • TIMESTAMPTZ — 日期 + 时间 + 时区(推荐用于事件)

INTERVAL:时间跨度

INTERVAL 表示一段时长。您可以将它与日期或时间戳相加或相减:

SELECT NOW() + INTERVAL '1 day';
SELECT NOW() - INTERVAL '30 days';
SELECT NOW() + INTERVAL '3 months 2 weeks';
SELECT INTERVAL '1 hour' + INTERVAL '15 minutes';

INTERVAL 的单位

您可以使用 year, month, week, day, hour, minute, second(单数或复数形式):

SELECT INTERVAL '2 years 6 months';
SELECT INTERVAL '1 week';
SELECT INTERVAL '90 seconds';

常见的相对日期筛选

最常用的“最近 N 天”查询:

SELECT * FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';

SELECT * FROM events
WHERE created_at >= CURRENT_DATE - INTERVAL '1 month';

向 DATE 添加天数

PostgreSQL 还允许使用 date + integer 表示“添加 N 天”:

SELECT DATE '2024-01-01' + 30;     -- 2024-01-31
SELECT DATE '2024-01-01' - 1;      -- 2023-12-31

两个时间戳相减

两个时间戳的差值是一个 INTERVAL:

SELECT NOW() - '2024-01-01'::TIMESTAMP;
-- → '125 days 14:30:00'

SELECT EXTRACT(EPOCH FROM (NOW() - created_at))/3600 AS hours_ago
FROM events;

AGE:易读的时间差

AGE(end, start) 返回一个由年、月、日组成的 INTERVAL:

SELECT AGE(NOW(), birth_date) AS age_interval
FROM users WHERE id = 1;

SELECT EXTRACT(YEAR FROM AGE(birth_date)) AS age_in_years
FROM users;

添加月份——请谨慎

添加月份遵循日历运算。2024-01-31 + 1 month = 2024-02-29(会截断到有效日期):

SELECT DATE '2024-01-31' + INTERVAL '1 month';   -- 2024-02-29
SELECT DATE '2024-03-31' + INTERVAL '1 month';   -- 2024-04-30

CURRENT_DATE 与 NOW()

两者的返回类型不同——请选择适合您需求的那个:

SELECT CURRENT_DATE;        -- 2024-03-15 (DATE)
SELECT CURRENT_TIME;        -- 14:30:00+02 (TIMETZ)
SELECT CURRENT_TIMESTAMP;   -- 2024-03-15 14:30:00+02 (TIMESTAMPTZ)
SELECT NOW();               -- alias for CURRENT_TIMESTAMP

根据各个部分构造日期

根据整数列构造日期:

SELECT MAKE_DATE(year, month, day) FROM birthdays;
SELECT MAKE_TIMESTAMP(2024, 3, 15, 14, 30, 0.0);

日期表达式上的索引

在 created_at 上创建的索引可以很好地处理范围查询。对于“3 月份的事件”,范围筛选比按月份截断更快:

-- Index-friendly:
WHERE created_at >= '2024-03-01' AND created_at < '2024-04-01';

-- Less friendly (works only with expression index):
WHERE date_trunc('month', created_at) = '2024-03-01';

回顾

SQL 中的日期运算功能丰富且可靠。

  • 使用 INTERVAL 表示时长
  • 直接进行加法或减法
  • 使用 AGE 表示易读的时间跨度
  • 半开区间最有利于使用索引

快速检查

哪个表达式会返回最近 7 天内的事件?

常见问题解答

「日期运算与 INTERVAL」课时是免费的吗?

是的 — 「日期运算与 INTERVAL」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「日期运算与 INTERVAL」这节课中我会学到什么?

使用 INTERVAL 加减日期、计算时长,并构建“最近 7 天”等相对日期过滤条件。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「日期运算与 INTERVAL」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 日期运算与 INTERVAL
  2. EXTRACT、DATE_TRUNC、AGE
  3. 时区:TIMESTAMP 与 TIMESTAMPTZ
  4. 常见日期报表(MTD、WoW、YoY)
← 返回 SQL Academy