MySQL日期时间的处理函数

日期/时间处理函数

  • 获取当前日期时间函数

|------------|---------------|-----------------------------|---------------------|
| 函数 | 作用 | 示例 | 结果 |
| NOW() | 获取当前日期时间 | Select NOW() from dual; | 2025-12-31 13:16:20 |
| SYSDATE() | 获取系统时间,执行时的时间 | Select SYSDATE() from dual; | 2025-12-31 13:16:20 |
| CURDATAE() | 获取当前日期 | Select CURDATE() from dual; | 2025-12-31 |
| CURTIME() | 获取当前时间 | Select CURTIME() from dual; | 13:16:20 |

select NOW(), SYSDATE(), CURDATE(), CURTIME() from dual;

`NOW()` `SYSDATE()` `CURDATE()` `CURTIME()`

2025-12-31 13:16:20 2025-12-31 13:16:20 2025-12-31 13:16:20

  • 时间提取函数(拆分年/月/日/时/分/秒)

|-------------|------------|----|----------|
| 函数 | 作用 | 示例 | 结果 |
| YEAR() | 年 | | 2025 |
| MONTH() | 月 | | 12 |
| MONTHNAME() | 月份英文名 | | December |
| DAY() | 日 | | 31 |
| DAYOFWEEK() | 星期几(1=星期日) | | 4 |
| DAYOFYEAR() | 一年中第几天 | | 365 |
| HOUR() | 时 | | 13 |
| MINUTE() | 分 | | 16 |
| SECOND() | 秒 | | 20 |
| QUARTER() | 季度 | | 4 |

Select YEAR(NOW()), MONTH(NOW()), MONTHNAME(NOW()), DAY(NOW()), DAYOFWEEK(NOW()), DAYOFYEAR(NOW()), HOUR(NOW()), MINUTE(NOW()), SECOND(NOW()), QUARTER(NOW()) from dual;

`YEAR(NOW())` `MONTH(NOW())` `MONTHNAME(NOW())` `DAY(NOW())` `DAYOFWEEK(NOW())` `DAYOFYEAR(NOW())` `HOUR(NOW())` `MINUTE(NOW())` `SECOND(NOW())` `QUARTER(NOW())`

  1. 12 December 31 4 365 13 16 20 4
  • 时间格式化
  1. 时间格式-->字符串

语法:DATE_FORMAT(时间字段,'格式字符串')

常用格式符:

%Y--4位年;%y--2位年;%m--2位月(补0);%c--1位月;%d--2位日(补0);%e--1位日;

%H--24小时制;%h--12小时制;%i--分钟;%s秒

DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')----2025-12-31 13:16:20

DATE_FORMAT(now(), '%Y-%m-%d')----2025-12-31

DATE_FORMAT(NOW(), '%Y年%m月%d日')----2025年12月31日

DATE_FORMAT(NOW(), '%Y%m')--202512

  1. 字符串-->时间格式

语法:STR_TO_DATE('字符串', '格式格式串')

常用格式符:

%Y--4位年;%y--2位年;%m--2位月(补0);%c--1位月;%d--2位日(补0);%e--1位日;

%H--24小时制;%h--12小时制;%i--分钟;%s秒

STR_TO_DATE('2025/06/06','%Y/%m/%d')----2025-06-06

STR_TO_DATE('20251231', '%Y%m%d')----2025-12-31

STR_TO_DATE('20250801111213','%Y%m%d%H%i%s')----2025-08-01 11:12:13

  • 时间计算函数(加减/相差计算)
  1. 加减计算的语法:

DATE_ADD(时间字段, INTERVAL 数值 单位) -- 加时间

DATE_SUB(时间字段, INTERVAL 数值 单位) -- 减时间

支持单位:YEAR/MONTH/DAY/HOUR/MINUTE/SECOND/WEEK/QUARTER

select NOW(), DATE_ADD(NOW(), interval 2 DAY), DATE_ADD(NOW(), interval 1 MONTH) from dual;

2026-01-05 10:00:00 2026-01-07 10:00:00 2026-02-05 10:00:00

select NOW(), DATE_SUB(NOW(), interval 2 DAY), DATE_SUB(NOW(), interval 2 YEAR) from dual;

2026-01-05 10:00:00 2026-01-03 10:00:00 2024-01-05 10:00:00

  1. 日期的相差(DATEDIFF()/TIMESTAMPDIFF())

|-----------------|------------|-------------------------------|----------------------------------------------|
| 函数 | 作用 | 语法 | 示例 |
| DATEDIFF() | 计算两个日期的天数差 | DATEDIFF(日期1, 日期2) | DATEDIFF('2026-01-10', NOW()) --5 |
| TIMESTAMPDIFF() | 计算任意单位的时间差 | TIMESTAMPDIFF(单位, 开始时间, 结束时间) | TIMESTAMPDIFF(hour, '2026-01-05',NOW()) --14 |

  1. 特殊计算:

LAST_DAY():获取指定日期所在月份的最后一天。

DATE():提取时间字段的日期部分(忽略时分秒)

select last_day(now()), date(NOW()) from dual;

2026-01-31 2026-01-05

  • 特定时间

1、当天、昨天、明天、本月初、本月末、上月的今天、上月初、上月末、

今年年初、今年的年末、去年的今天、去年初、去年末。

select '今天' as '日期', date(NOW()) from dual union all

select '昨天' as '日期', DATE_SUB(date(NOW()), interval 1 day) from dual union all

select '明天' as '日期', DATE_ADD(date(NOW()), interval 1 day) from dual union all

select '当月初' as '日期', DATE_ADD(last_day(DATE_SUB(date(NOW()), interval 1 month)), interval 1 day) from dual union all

select '当月末' as '日期', last_day(date(NOW())) from dual union all

select '上月的今天' as '日期', DATE_SUB(date(NOW()), interval 1 month) from dual union all

select '上月初' as '日期', DATE_ADD(last_day(DATE_SUB(date(NOW()), interval 2 month)), interval 1 day) from dual union all

select '上月末' as '日期', last_day(DATE_SUB(date(NOW()), interval 1 month)) from dual union all

select '今年初' as '日期', DATE_FORMAT(CURDATE(), '%Y-01-01') from dual union all

select '今年末' as '日期', DATE_FORMAT(CURDATE(), '%Y-12-31') from dual;

|-------|------------|---|
| 日期 | 结果 | |
| 今天 | 2026-01-07 | |
| 昨天 | 2026-01-06 | |
| 明天 | 2026-01-08 | |
| 当月初 | 2026-01-01 | |
| 当月末 | 2026-01-31 | |
| 上月的今天 | 2025-12-07 | |
| 上月初 | 2025-12-01 | |
| 上月末 | 2025-12-31 | |
| 今年初 | 2026-01-01 | |
| 今年末 | 2026-12-31 | |

2、对于闰年2月末,平年2月末的问题

select DATE_SUB(date('2026-03-31'), interval 1 month) from dual; -- 2026-02-28

select DATE_ADD(date('2024-02-29'), interval 1 year) from dual; -- 2025-02-28

3、当天是本年度的第几天

当天是本周几:1=周日;2=周一;3=周二;4=周三;5=周四;6=周五;7=周六。

select dayofyear(now()) from dual; --7

select dayofweek(now()) from dual; --4

4、周几转化成中文星期

select case DAYOFWEEK(NOW())

when 1 then '周日'

when 2 then '周一'

when 3 then '周二'

when 4 then '周三'

when 5 then '周四'

when 6 then '周五'

when 7 then '周六'

end

as week_day_cn from dual;

相关推荐
2601_9495936518 分钟前
深入解析CANN-acl应用层接口:构建高效的AI应用开发框架
数据库·人工智能
javachen__18 分钟前
mysql新老项目版本选择
数据库·mysql
Dxy123931021636 分钟前
MySQL如何高效查询表数据量:从基础到进阶的优化指南
数据库·mysql
Dying.Light39 分钟前
MySQL相关问题
数据库·mysql
蜡笔小炘1 小时前
LVS -- 利用防火墙标签(FireWall Mark)解决轮询错误
服务器·数据库·lvs
韩立学长1 小时前
基于Springboot泉州旅游攻略平台d5h5zz02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·旅游
Re.不晚2 小时前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设2 小时前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据2 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300962 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python