日期运算与 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-30CURRENT_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 反馈 — 无需本地设置。