mysql日期时间函数

当前时间
复制代码
> SELECT CURDATE(),CURTIME(),NOW();
->2024-01-10 | 10:47:18  | 2024-01-10 10:47:18 
> select sysdate();
->2024-01-10 10:47:18 

NOW()

返回当前日期时间,返回格式要么是字符串"YYYY-MM-DD HH-MM-SS"格式,要么是数字YYYYMMDDhhmmss格式,取决于使用函数上下文。

复制代码
>SELECT NOW(), NOW() + 1
 ->2024-01-10 09:54:00|20240110095401

直接使用默认字符串,+1用作数字处理。sysdate()和now()类似。只是两个表示的时间稍微有些差别,now()表示当前语句开始执行时间点,在一个语句中多次通过now()获取时间是相同的,sysdate()而是当前时点的时间,是一直在增加的。

复制代码
> SELECT NOW(), SLEEP(2), NOW();
-> 2024-01-10 14:06:49 |        0 | 2024-01-10 14:06:49 
> SELECT SYSDATE(), SLEEP(2), SYSDATE();
-> 2024-01-10 14:07:03 |        0 | 2024-01-10 14:07:05 

当前日期curdate,当前时间CURTIME。分别获取日期和时间部分。

时间戳转时间
复制代码
> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());
 2024-01-10 14:19:36 

有时候会将时间戳存起来记录时间,可以使用FROM_UNIXTIME将时间戳转成时间。

时间抽取

从日期/时间值中提取特定部分的值。语法如下:EXTRACT(unit FROM date)

EXTRACT(unit FROM date)其中,unit表示要提取的时间单位,可以是MONTH、DAY、HOUR、MINUTE等,文章最后有unit的可选值列表

date表示要提取的日期/时间值。

复制代码
>SELECT EXTRACT(YEAR from NOW())
 ->2024
>SELECT EXTRACT(HOUR from NOW())
 ->9
>SELECT EXTRACT(QUARTER FROM '2019-07-02')
 ->3

除了使用extract函数获取对应时间部分,每一部分都有对应的函数来获取datetime指定部分的值

复制代码
>SELECT YEAR(NOW()),DAY(NOW()),MONTH(NOW()),HOUR(NOW()),MINUTE(NOW()),SECOND(NOW())
 -> 2024 |         10 |            1 |          10 |            12 |            41 |
时间计算

DATE_ADD(date,INTERVAL expr unit),DATE_SUB(date,INTERVAL expr unit)

expr表示时间间隔间隔,可以是负数,unit表示时间单位。

date_add表示加上多少时间,date_sub(subtracted )表示减去多少时间

复制代码
> SELECT DATE_ADD('2024-01-01',INTERVAL 1 DAY);
 -> 2024-01-02 
> SELECT DATE_ADD('2024-01-01',INTERVAL 1 YEAR);
 ->2025-01-01 

两个日期时间差DATEDIFF()

复制代码
> SELECT DATEDIFF('2023-12-31','2023-11-30');
->31
>SELECT DATEDIFF('2023-12-31 23:59:59','2024-01-09');
->-9

计算两个日期相差的天数,只有日期部分会被使用。第一个减去第二个

按指定时间单位计算时间差TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

复制代码
> SELECT TIMESTAMPDIFF(MONTH,'2023-02-01','2023-05-01');
->3
> SELECT TIMESTAMPDIFF(MINUTE,'2023-12-31','2023-12-31 12:00:55');
->720
> SELECT TIMESTAMPDIFF(SECOND,'2023-12-31','2023-12-31 00:01:30')
->90
月初月末

当前时间所在月份最后一天LAST_DAY(date)

复制代码
> SELECT LAST_DAY(NOW());
->2024-01-31

借助last_day和date_add获取月初

复制代码
>SELECT DATE_ADD(LAST_DAY(NOW()),INTERVAL 1 DAY)
->2024-01-31
获取日期次序
复制代码
> SELECT DAYOFYEAR('2023-12-31'),DAYOFMONTH('2023-12-31'),DAYOFWEEK('2023-12-31');
->365 |                       31 |                       1 

DAYOFYEAR:一年中第几天(1~366)

DAYOFMONTH:当月第几天(1~31)

DAYOFWEEK:周几(1 = 周日, 2 = 周一, ..., 7 = 周六)

日期格式化

DATE_FORMAT(date,format) 日期按指定格式输出。

常见格式:

年:%Y (4位年),%y(2位年)

月:%m(01~12),%M(名称January...December),%c (1~12没有前导0)

日:%d (01~31), %e (1~31没有前导0)

时:%H (24小时制00...23),%h(12小时制00~12),

分:%i(00~59)

秒:%s %S (不区分大小写,00~59)

微秒:%f (000000...999999)

上午下午:%p (AM或PM)

周几:%w (0周日,6周六)

一年中第几天:%j (001...366)

复制代码
> SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
->2024-01-10 11:24:55 
时间单位

前面在一些时间函数中,如EXTRACT,TIMESTAMPDIFF,DATE_ADD中有unit时间单位参数,下面是一些时间单位的值选项说明。

unit (时间单位) expr 值格式
MICROSECOND MICROSECONDS
SECOND SECONDS
MINUTE MINUTES
HOUR HOURS
DAY DAYS
WEEK WEEKS
MONTH MONTHS
QUARTER QUARTERS
YEAR YEARS
SECOND_MICROSECOND 'SECONDS.MICROSECONDS'
MINUTE_MICROSECOND 'MINUTES:SECONDS.MICROSECONDS'
MINUTE_SECOND 'MINUTES:SECONDS'
HOUR_MICROSECOND 'HOURS:MINUTES:SECONDS.MICROSECONDS'
HOUR_SECOND 'HOURS:MINUTES:SECONDS'
HOUR_MINUTE 'HOURS:MINUTES'
DAY_MICROSECOND 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS'
DAY_SECOND 'DAYS HOURS:MINUTES:SECONDS'
DAY_MINUTE 'DAYS HOURS:MINUTES'
DAY_HOUR 'DAYS HOURS'
YEAR_MONTH 'YEARS-MONTHS'
相关推荐
运维行者_5 小时前
企业无线网络监控的挑战与智能化演进趋势
大数据·运维·服务器·网络·数据库
国强_dev6 小时前
技术探讨:使用 stunnel 加密转发数据库连接时,如何获取客户端真实 IP?
数据库·网络协议·tcp/ip
@insist1236 小时前
系统规划与管理师-信息系统规划核心工作要点解析
数据库·软考·系统规划与管理师·软件水平考试·系统规划与管理工程师
超级数据查看器6 小时前
超级数据查看器 v10.0 发布
java·大数据·数据库·sqlite·安卓
数安3000天7 小时前
增量数据如何自动分类分级,避免目录“过期“?
大数据·数据库
南墙上的石头8 小时前
麒麟 V10 重装人大金仓 V8R6 踩坑实录(含 MySQL 兼容模式)
数据库·mysql
画中有画8 小时前
论向量数据库在项目中的应用
数据库
spider_xcxc9 小时前
Redis 数据库高质量实践指南(一)
运维·数据库·redis·oracle·云计算
l1t10 小时前
在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
linux·运维·数据库·windows·duckdb
执子手 吹散苍茫茫烟波10 小时前
RC 隔离级别下 MySQL InnoDB 死锁典型案例
数据库·mysql