首页/数据/数据库速查/日期时间函数:NOW / CURDATE / DATE_FORMAT / DATE_ADD
SQL 语法52 条

日期时间函数:NOW / CURDATE / DATE_FORMAT / DATE_ADD

取当前时间、格式化、日期加减与差值计算;日期函数用在索引列上会阻断索引,过滤要改写为范围条件。

数据库速查数据更新于 2026-10-13

日期时间函数是什么

日期时间函数覆盖四类需求:取当前时间(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 的变化即可确认效果。

易错点

  • 在 WHERE 里对索引列套 DATE 或 YEAR 函数,索引失效退化成全表扫描
  • 用字符串格式化结果继续做时间比较,排序与筛选结果不符合预期
  • 忽略会话时区差异,写入的时间与业务预期相差数小时
  • 用 DATEDIFF 计算精确时长,忽略它只比较日期部分丢了时分秒
  • 应用侧生成时间字符串再传给数据库,格式不一致时插入了错误值

数据来源与参考

  • MySQL 8.0 Reference Manual: Date and Time Functions

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌