MySQL 里怎么获取当前日期和时间
MySQL 提供多个函数返回当前时刻,但行为不同,选错会出逻辑 bug。
NOW()和
CURRENT_TIMESTAMP()是等价的,返回带时分秒的
DATETIME值(如
'2024-05-12 14:23:05');
CURDATE()只返回日期部分(
'2024-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可能跳到不存在的日期(如
'2024-01-31' + 1 MONTH→
'2024-02-31'→ 自动转为
'2024-03-02'),业务敏感场景需额外校验
如何把字符串转成日期再比较
从日志或前端传入的日期常是字符串(如
'2024/05/12'或
'12-May-2024'),直接跟
DATE字段比会走字符比较,结果不可靠。必须用
STR_TO_DATE()显式转换。 格式符必须严格匹配输入:`
STR_TO_DATE('2024/05/12', '%Y/%m/%d')` ✅,`STR_TO_DATE('2024/05/12', '%Y-%m-%d')` ❌(斜杠不等于短横)
常见格式符:%Y四位年,
%y两位年,
%m01–12,
%c1–12(无前导零),
%d01–31,
%e1–31 转换失败返回
NULL,建议配合
IS NOT NULL过滤,否则
WHERE条件可能漏数据
为什么 WHERE date_col = '2024-05-12' 查不到数据
这是最常见的时间陷阱:当
date_col是
DATETIME或
TIMESTAMP类型时,
'2024-05-12'会被 MySQL 隐式转成
'2024-05-12 00:00:00',只能匹配该秒的数据,几乎必然为空。
SELECT * FROM orders WHERE order_time >= '2024-05-12' AND order_time < '2024-05-13';永远优先用范围查询代替等值查询处理日期范围 别依赖
DATE(order_time) = '2024-05-12',它会让索引失效(全表扫描) 如果字段是
DATE类型且确定无时间部分,等值查询才安全
时区、隐式转换、索引失效这三块最容易在线上出问题,改之前最好先
EXPLAIN看执行计划。
