日期时间函数是什么
日期时间函数覆盖四类需求:取当前时间(NOW、CURDATE、UNIX_TIMESTAMP)、格式化(DATE_FORMAT)、日期加减(DATE_ADD、DATE_SUB)、差值计算(DATEDIFF、TIMESTAMPDIFF)。最容易踩坑的是索引:把函数套在索引列上,例如 WHERE DATE(created_at)='2026-10-12',索引会直接失效,应改写成范围条件。
基本信息
| 常用函数 | NOW / CURDATE / DATE_FORMAT / DATE_ADD / DATEDIFF / TIMESTAMPDIFF |
|---|---|
| 返回类型 | DATETIME、DATE 或数字(时间戳、天数) |
| 时区影响 | NOW 与 UNIX_TIMESTAMP 受 time_zone 影响,UTC_TIMESTAMP 不受 |
| 精度控制 | NOW(3) 取毫秒级时间 |
| 核对时区 | SHOW VARIABLES LIKE 'time_zone' |
典型使用场景
- 报表按天汇总:先按日期表达式分组再统计指标
- 计算到期时间:用 DATE_ADD 生成到期日并写入业务表
- 计算间隔:用 TIMESTAMPDIFF 得到分钟或小时级的差值
- 格式化输出:把时间字段整理成可读字符串用于导出
- 时间戳互转:UNIX_TIMESTAMP 与 FROM_UNIXTIME 配合处理第三方数据
- 范围查询:按时间窗口过滤数据并保证索引可用
- 跨时区业务:尽量统一用 UTC 存储时间,展示层再换算成本地时间
常用示例
常用示例
SELECT NOW(), CURDATE(), UNIX_TIMESTAMP();
SELECT DATE_FORMAT(created_at, '%Y-%m-%d %H:%i') AS t FROM orders LIMIT 1;
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY) AS tomorrow;
SELECT DATEDIFF('2026-10-12', '2026-10-01') AS days;
SELECT TIMESTAMPDIFF(MINUTE, created_at, NOW()) AS minutes FROM orders LIMIT 1;
SELECT FROM_UNIXTIME(1758000000) AS readable;
-- 推荐:范围条件,索引可用
SELECT id FROM orders WHERE created_at >= CURDATE() - INTERVAL 7 DAY;
-- 不推荐:函数套在索引列上,索引失效
SELECT id FROM orders WHERE DATE(created_at) = CURDATE();常用函数速查
| 函数 | 作用 | 注意点 |
|---|---|---|
| NOW() | 当前日期时间 | 受会话时区影响 |
| CURDATE() | 当前日期 | 只到天,不含时间部分 |
| DATE_FORMAT() | 格式化输出 | 结果变字符串,不能再比较时间 |
| DATE_ADD() | 日期加减 | 单位用 INTERVAL 关键字指定 |
| DATEDIFF() | 两个日期相差天数 | 只算日期部分,忽略时分秒 |
| TIMESTAMPDIFF() | 按指定单位求差 | 单位大小影响结果粒度 |
按日期过滤不要写成 WHERE DATE(created_at)='2026-10-12',应写 created_at >= '2026-10-12' AND created_at < '2026-10-13' 才能用上索引。
NOW() 受会话时区影响:应用连接时区与服务器不一致时会出现「时间对不上」的现象;跨时区业务统一用 UTC 存储、在展示层转换更稳妥。
函数出现在 SELECT 列表里没有问题,问题只出在 WHERE 与 JOIN 的条件上:判断依据是索引列有没有被函数包裹;改写前后用 EXPLAIN 对比 type 与 key 的变化即可确认效果。