首页/数据/SQL 速查/date_trunc 时间截断(PostgreSQL)与 MySQL 等价写法
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条
函数速查60 条
变更与事务52 条性能与执行计划72 条

date_trunc 时间截断(PostgreSQL)与 MySQL 等价写法

把时间截断到指定粒度(月/周/日/小时),做时间分桶统计的核心工具:PostgreSQL 有 date_trunc,MySQL 需要用日期运算拼装。

SQL 速查数据更新于 2026-10-12

PostgreSQL

PostgreSQL
SELECT date_trunc('month', now());            -- 本月 1 日 00:00
SELECT date_trunc('week',  now());            -- 本周一(ISO)00:00
SELECT date_trunc('day',   created_at) AS d, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;

MySQL 等价写法

MySQL 等价写法
-- 截断到月:先减掉(日-1)天
SELECT DATE_SUB(DATE(created_at), INTERVAL DAYOFMONTH(created_at)-1 DAY) AS m,
       COUNT(*)
FROM orders GROUP BY m;
-- 或格式化再解析
SELECT STR_TO_DATE(DATE_FORMAT(created_at, '%Y-%m-01'), '%Y-%m-%d') AS m FROM orders;
PostgreSQLdate_trunc(text, timestamp);支持 microsecond~millennium
MySQL无同名函数;DATE(dt) 截到天,月/周按日期运算组合
对 timestamptzPG 按会话时区截断,跨时区报表要显式 AT TIME ZONE

易错点

  • GROUP BY date_trunc(...) 表达式在 PostgreSQL 可用序号或别名,跨库脚本里 MySQL 要重复表达式
  • 对 timestamptz 调用 date_trunc 时按会话时区截断,服务时区变化会让统计口径漂移,固定时区再截

数据来源与参考

  • PostgreSQL Documentation · Date/Time Functions and Operators
  • MySQL 8.0 Reference Manual · Date and Time Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌