MySQL 日期函数怎么写才不报错
直接用
NOW()、
CURDATE()、
CURTIME()就行,它们不带参数,括号不能省。常见错误是写成
NOW(漏括号)或
NOW()加引号变成字符串,MySQL 会报
FUNCTION xxx does not exist或隐式类型转换出错。
NOW()返回
YYYY-MM-DD HH:MM:SS格式的当前时间戳(含秒)
CURDATE()只返回日期部分,等价于
DATE(NOW())
CURTIME()只返回时间部分,等价于
TIME(NOW())所有函数都基于服务器系统时区,不是客户端本地时间
DATE_FORMAT() 格式化字符串怎么配对
DATE_FORMAT()是 MySQL 里最常用也最容易写错的格式化函数:第二个参数必须是格式字符串,且所有占位符都以
%开头,不能用
yyyy-MM-dd这类 Java 风格写法。
%Y:4 位年份(如
2024),
%y是 2 位(
24)
%m:补零月份数字(
01–
12),
%c不补零(
1–
12)
%d:补零日期(
01–
31),
%e不补零
%H:24 小时制小时(
00–
23),
%h或
%I是 12 小时制(
01–
12) 常见误写:
%MM(多一个 M)、
%DD、把
%s当秒(其实是
%s表示秒,但
%S也合法;注意
%s在某些旧版本有歧义,建议统一用
%S)
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S'); -- 正确:2024-06-15 14:23:05 SELECT DATE_FORMAT(NOW(), '%y/%c/%e %h:%i %p'); -- 正确:24/6/15 02:23 PM
UNIX_TIMESTAMP 和 FROM_UNIXTIME 怎么互转不丢精度
UNIX_TIMESTAMP()默认返回整数秒级时间戳,但传入 DATETIME 值时,如果原字段含微秒(如
2024-06-15 10:20:30.123456),默认会截断——除非显式指定精度。
UNIX_TIMESTAMP(NOW(6))才能返回带微秒的浮点数(如
1718446830.123456)
FROM_UNIXTIME(1718446830.123456)能还原为
2024-06-15 10:20:30.123456,但注意:MySQL 5.6.4+ 才支持微秒,低版本会静默丢弃小数部分 直接对
TIMESTAMP字段调用
UNIX_TIMESTAMP(col)是安全的,它自动按字段精度处理 别用
UNIX_TIMESTAMP('2024-06-15') 这种字符串输入——依赖系统默认时区和日期解析规则,易出错;优先用 STR_TO_DATE()先转成日期再算
为什么 NOW() 和 SYSDATE() 结果有时不一样
这是 MySQL 特有的行为差异点,很多人在事务或函数中踩坑。简单说:
NOW()返回语句开始执行的时间点,而
SYSDATE()返回函数实际执行的实时时间。 在一条语句里多次调用
NOW(),值始终一致;
SYSDATE()每次可能不同(尤其在 sleep 后) 在存储过程或触发器中,如果语句执行耗时长,
SYSDATE()更反映“此刻”,
NOW()更适合做逻辑一致性快照 复制场景下,
NOW()是确定性函数(可被 binlog 安全记录),
SYSDATE()默认是非确定性的,主从可能不一致——除非显式设置
SET TIMESTAMP = xxx或启用
sysdate-is-now=ON
SELECT NOW(), SLEEP(2), NOW(), SYSDATE(), SLEEP(2), SYSDATE(); -- 结果类似:2024-06-15 10:00:00 | 0 | 2024-06-15 10:00:00 | 2024-06-15 10:00:02 | 0 | 2024-06-15 10:00:04
微秒精度、时区上下文、格式字符串大小写敏感、以及
NOW()与
SYSDATE()的语义区别,这几个地方最容易在上线后暴露问题。
