MySQL获取当前日期时间应选对函数:NOW()和CURRENT_TIMESTAMP()返回DATETIME,CURDATE()和CURTIME()分别返回日期和时间;日期加减须用DATE_ADD()/DATE_SUB();字符串转日期用STR_TO_DATE()并严格匹配格式;比较DATETIME字段需避免隐式转换。
MySQL 提供多个函数返回当前时刻,但行为不同,选错会出逻辑 bug。NOW() 和 CURRENT_TIMESTAMP() 是等价的,返回带时分秒的 DATETIME 值(如 '2025-05-12 14:23:05');CURDATE() 只返回日期部分('2025-05-12'),CURTIME() 只返回时间部分('14:23:05')。
DATE 类型,用 CURDATE() 更安全,避免隐式类型转换
NOW() 在一个语句内多次调用,返回的是同一时间戳(事务内一致),不是实时刷新SELECT @@time_zone; 查看,也可临时设为 '+08:00'
MySQL 不支持直接用 + 或 - 对日期做算术运算(比如 date_col + 1 会变成数字加法)。必须用 DATE_ADD() 或 DATE_SUB(),或其简写形式 ADDDATE()/SUBDATE()。
DATE_ADD(NOW(), INTERVAL 7 DAY)、DATE_SUB(order_time, INTERVAL 3 HOUR)
DAY、MONTH、YEAR、HOUR、MINUTE,不能写成 days 或 day(单数复数都错)DATE 字段加 INTERVAL 1 MONTH 可能跳到不存在的日期(如 '2025-01-31' + 1 MONTH → '2025-02-31' → 自动转为 '2025-03-02'),业务敏感场景需额外校验从日志或前端传入的日期常是字符串(如 '2025/05/12' 或 '12-May-2025'),直接跟 DATE 字段比会走
字符比较,结果不可靠。必须用 STR_TO_DATE() 显式转换。
STR_TO_DATE('2025/05/12', '%Y/%m/%d')` ✅,`STR_TO_DATE('2025/05/12', '%Y-%m-%d')` ❌(斜杠不等于短横)%Y 四位年,%y 两位年,%m 01–12,%c 1–12(无前导零),%d 01–31,%e 1–31NULL,建议配合 IS NOT NULL 过滤,否则 WHERE 条件可能漏数据这是最常见的时间陷阱:当 date_col 是 DATETIME 或 TIMESTAMP 类型时,'2025-05-12' 会被 MySQL 隐式转成 '2025-05-12 00:00:00',只能匹配该秒的数据,几乎必然为空。
SELECT * FROM orders WHERE order_time >= '2025-05-12' AND order_time < '2024-05-13';
DATE(order_time) = '2025-05-12',它会让索引失效(全表扫描)DATE 类型且确定无时间部分,等值查询才安全时区、隐式转换、索引失效这三块最容易在线上出问题,改之前最好先 EXPLAIN 看执行计划。