date_format 和 now 是 mysql 中最常用、最实用的日期处理函数组合,now() 获取当前时间避免硬编码,date_format 按需格式化输出,二者结合可高效完成动态时间计算、报表统计等任务,但需注意索引失效和时区一致性问题。

DATE_FORMAT 和 NOW 是 MySQL 中最常用、最实用的日期处理函数组合,掌握它们能快速完成时间格式化、动态时间计算、报表生成等任务,无需在应用层额外处理。
用 NOW() 获取当前时间,避免硬编码
写 SQL 时别再手写 '2024-06-15' 这类固定值。NOW() 返回精确到秒的当前日期时间(如 2024-06-15 14:22:38),确保查询结果实时有效。
- 插入记录时自动记录创建时间:
INSERT INTO orders (product, created_at) VALUES ('book', NOW()) - 查询今天新增的数据:
SELECT * FROM logs WHERE DATE(created_at) = DATE(NOW()) - 对比时间范围更安全:用
NOW() - INTERVAL 7 DAY替代拼接字符串,避免时区或格式错误
DATE_FORMAT 精准控制输出格式
DATE_FORMAT 不只是“转成字符串”,而是按需提取和重组时间字段。语法为 DATE_FORMAT(date, format_str),其中 format_str 支持多种占位符:
-
%Y→ 四位年份(2024),%y→ 两位年份(24) -
%m→ 数字月(06),%M→ 英文全称(June) -
%d→ 日(15),%W→ 星期全名(Saturday) - 常用组合示例:
DATE_FORMAT(NOW(), '%Y-%m')→ 2024-06(按年月分组统计)DATE_FORMAT(NOW(), '%m/%d/%y %h:%i %p')→ 06/15/24 02:22 PM(报表展示)
组合使用:动态生成统计维度
把 NOW 和 DATE_FORMAT 结合,可直接在 SQL 中构造业务需要的时间标签,省去程序端逻辑。
- 查“本月销售汇总”:
SELECT SUM(amount), DATE_FORMAT(order_time, '%Y-%m') AS ym FROM sales WHERE order_time >= DATE_FORMAT(NOW(), '%Y-%m-01') GROUP BY ym - 生成“最近 30 天每日访问量”:
SELECT DATE_FORMAT(access_time, '%Y-%m-%d') AS day, COUNT(*) FROM visits WHERE access_time >= NOW() - INTERVAL 30 DAY GROUP BY day ORDER BY day - 注意:WHERE 条件中慎用 DATE_FORMAT 过滤(会导致索引失效),优先用范围比较(如
>= '2024-01-01'或>= DATE_SUB(NOW(), INTERVAL 1 MONTH))
注意事项与性能提醒
高效不等于无脑用。几个关键细节影响准确性和速度:
- NOW() 返回的是执行时刻的时间,同一语句内多次调用值相同;若需更高精度,可用 SYSDATE()
- DATE_FORMAT 返回字符串类型,不能直接参与日期运算,需要转换请用 STR_TO_DATE()
- 对大表按日期字段查询时,确保该字段有索引,且 WHERE 条件尽量避免在列上套函数(如
DATE(create_time) = CURDATE()会跳过索引) - 跨时区场景下,确认 MySQL server、session、应用层时区一致,必要时用 CONVERT_TZ()










