sql中日期函数的基本语法_mysql时间处理规则

4次阅读

MySQL 获取当前日期时间应选对函数:NOW()和 CURRENT_TIMESTAMP()返回 DATETIME,CURDATE()和 CURTIME()分别返回日期和时间;日期加减须用 DATE_ADD()/DATE_SUB();字符串转日期用 STR_TO_DATE()并严格匹配格式;比较 DATETIME 字段需避免隐式转换。

sql 中日期函数的基本语法_mysql 时间处理规则

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)
  • 单位要写全小写:DAYMONTHYEARHOURMINUTE,不能写成 daysday(单数复数都错)
  • 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 两位年,%m 01–12,%c 1–12(无前导零),%d 01–31,%e 1–31
  • 转换失败返回 NULL,建议配合 IS NOT NULL 过滤,否则 WHERE 条件可能漏数据

为什么 WHERE date_col = ‘2024-05-12’ 查不到数据

这是最常见的时间陷阱:当 date_colDATETIMETIMESTAMP 类型时,'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 看执行计划。

星耀云
版权声明:本站原创文章,由 星耀云 2026-01-09发表,共计1436字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。