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

来源:这里教程网 时间:2026-02-28 20:46:25 作者:

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()
的语义区别,这几个地方最容易在上线后暴露问题。

相关推荐