mysql中日期与时间函数的基本语法与格式化

6次阅读

mysql日期函数需严格语法:NOW()、CURdate()、CURTIME()不带参数且括号不可省;DATE_FORMAT()格式符以%开头,如%Y、%m;unix_timestamp()默认秒级,微秒需NOW(6);NOW()返回语句开始时间,SYSDATE()返回实时时间。

mysql中日期与时间函数的基本语法与格式化

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:补零月份数字(0112),%c 不补零(112
  • %d:补零日期(0131),%e 不补零
  • %H:24 小时制小时(0023),%h%I 是 12 小时制(0112
  • 常见误写:%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() 的语义区别,这几个地方最容易在上线后暴露问题。

text=ZqhQzanResources