百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

《MySQL 入门教程》第16篇MySQL常用函数之日期函数

bigegpt 2024-10-03 14:49 4 浏览

原文地址:https://blog.csdn.net/horses/article/details/107563145

原文作者:不剪发的Tony老师

来源平台:CSDN

上一篇介绍了 MySQL 中常用的字符函数,本篇我们继续讨论常用的 MySQL 日期函数。

日期函数和运算符用于日期和时间类型的数据进行操作并返回一个结果。以下是 MySQL 中常见的日期函数和运算符:


下面我们通过一些示例来说明这些函数的作用。

16.1 获取当前日期和时间

CURDATE()CURRENT_DATE()CURRENT_DATE 函数用于返回当前时间,返回格式为日期类型的 ‘YYYY-MM-DD’ 或者整数类型的 YYYYMMDD 。例如:

select curdate(), current_date + 0;
curdate() |current_date + 0|
----------|----------------|
2020-07-26|        20200726|

CURRENT_TIMECURRENT_TIME([fsp])CURTIME([fsp]) 函数用于返回当前时间,返回格式为时间类型的 ‘hh:mm:ss’ 或者整数类型的 hhmmss。例如:

select curtime(), current_time + 0;
curtime()|current_time + 0|
---------|----------------|
 20:59:57|          205957|

参数 fsp 用于指定小数秒的精度,取值为 0 到 6。例如:

select current_time(6);
current_time(6)|
---------------|
21:00:15.432279|

NOW([fsp]) 函数用于返回当前日期时间,返回格式为日期时间类型的 ‘YYYY-MM-DD hh:mm:ss’ 或者整数类型的 YYYYMMDDhhmmss;CURRENT_TIMESTAMP([fsp])CURRENT_TIMESTAMPLOCALTIME([fsp])LOCALTIMELOCALTIMESTAMP([fsp])LOCALTIMESTAMP 都是 Now() 函数的同义词。例如:

select now(), current_timestamp(6), localtime, localtimestamp(6);
now()              |current_timestamp(6)      |localtime          |localtimestamp(6)         |
-------------------|--------------------------|-------------------|--------------------------|
2020-07-26 21:01:03|2020-07-26 21:01:03.369695|2020-07-26 21:01:03|2020-07-26 21:01:03.369695|

SYSDATE([fsp]) 函数用于返回函数执行时的日期时间,返回格式为日期时间类型的 ‘YYYY-MM-DD hh:mm:ss’ 或者整数类型的 YYYYMMDDhhmmss。例如:

select sysdate(), sysdate(6);
sysdate()          |sysdate(6)                |
-------------------|--------------------------|
2020-07-26 21:08:53|2020-07-26 21:08:53.322645|

需要注意的是,NOW() 函数返回的是语句开始执行的时间,对于存储函数或者触发器返回的是函数执行或者触发语句执行的时间;SYSDATE() 函数返回的是该函数被执行的时间,同一个语句中多次调用可能返回不同的值。例如:

select now(), sysdate(), sleep(6), now(), sysdate();
now()              |sysdate()          |sleep(6)|now()              |sysdate()          |
-------------------|-------------------|--------|-------------------|-------------------|
2020-07-26 21:11:50|2020-07-26 21:11:50|       0|2020-07-26 21:11:50|2020-07-26 21:11:56|

从结果可以看出,两个 NOW() 函数返回了相同的时间;但是两个 SYSDATE() 函数的结果相差 6 秒;SLEEP() 函数用于暂停指定的秒数。

通过系统选项 --sysdate-is-now 可以将 SYSDATE() 设置为 NOW() 的同义词。

UTC_DATE()UTC_DATE 函数用于返回当前 UTC 日期,UTC_TIME([fsp])UTC_TIME 函数用于返回当前 UTC 时间,UTC_TIMESTAMP([fsp])UTC_TIMESTAMP 函数用于返回当前 UTC 日期和时间。例如:

select utc_date(), utc_time(6), utc_timestamp(6);
utc_date()|utc_time(6)    |utc_timestamp(6)          |
----------|---------------|--------------------------|
2020-07-26|13:23:41.993849|2020-07-26 13:23:41.993849|

北京时间是 +8 时区,所以 UTC 时间比当前时间慢 8 小时。

16.2 构造一个日期时间值

FROM_DAYS(N) 函数用于将一个第 0 年以来的天数转换为日期。例如:

select from_days(737997);
from_days(737997)|
-----------------|
       2020-07-26|

FROM_DAYS() 函数不支持公历出现之前的日期(1582 年)。另外,与该函数相反的是 TO_DAYS() 函数,参见下文第 16.4 节。

FROM_UNIXTIME(unix_timestamp[,format]) 函数用于将 Unix 时间戳转换为日期时间,返回格式为日期时间类型的 ‘YYYY-MM-DD hh:mm:ss’ 或者整数类型的 YYYYMMDDhhmmss。例如:

select from_unixtime(1595772000), from_unixtime(1595772000, '%Y %M %d %h:%i:%s %p');
from_unixtime(1595772000)|from_unixtime(1595772000, '%Y %M %d %h:%i:%s %p')|
-------------------------|-------------------------------------------------|

其中,字符串 format 用于设置日期时间的显示格式,具体参考下文第 16.4 节。

MAKEDATE(year,dayofyear) 函数返回一个由年和日组成的日期。例如:

select makedate(2020, 210), makedate(2020, 0);
makedate(2020, 210)|makedate(2020, 0)|
-------------------|-----------------|
         2020-07-28|                 |

2020 年第 210 天对于的日期是 2020-07-28。

MAKETIME(hour,minute,second) 函数返回一个由时、分、秒组成的时间。例如:

maketime(10, 20, 30)|maketime(10, 20, 30.456)|
--------------------|------------------------|
            10:20:30|         10:20:30.456000|

SEC_TO_TIME(seconds) 函数用于将数字形式的秒数转换为时间类型。例如:

select sec_to_time(3600), sec_to_time(3600)+0;
sec_to_time(3600)|sec_to_time(3600)+0|
-----------------|-------------------|
         01:00:00|              10000|

STR_TO_DATE(str,format) 函数用于将字符串转换为日期时间类型。例如:

select str_to_date('5 1, 2020','%m %d, %Y'), str_to_date('1:00:00','%H:%i:%s');
str_to_date('5 1, 2020','%m %d, %Y')|str_to_date('1:00:00','%H:%i:%s')|
------------------------------------|---------------------------------|
                          2020-05-01|                         01:00:00|

其中,字符串 format 用于设置日期时间的格式;另外,该函数是 DATE_FORMAT() 函数的相反操作,具体参考下文第 16.4 节。

TIMESTAMP(expr) 函数用于返回参数对应的日期时间,TIMESTAMP(expr1,expr2) 函数用于将一个日期时间增加指定的时间并返回结果。例如:

select timestamp('2020-07-26'), timestamp('2020-07-26 02:00:00', '10:00:00');
timestamp('2020-07-26')|timestamp('2020-07-26 02:00:00', '10:00:00')|
-----------------------|--------------------------------------------|
    2020-07-26 00:00:00|                         2020-07-26 12:00:00|

16.3 获取日期时间中的信息

DATE(expr) 函数用于获取日期时间中的日期部分,TIME(expr) 函数用于获取日期时间中的时间部分。例如:

select date('2020-07-26 10:00:00'), date('2020-07-26'), time('2020-07-26 10:00:00.450');
date('2020-07-26 10:00:00')|date('2020-07-26')|time('2020-07-26 10:00:00.450')|
---------------------------|------------------|-------------------------------|
                 2020-07-26|        2020-07-26|                10:00:00.450000|

EXTRACT(unit FROM date) 函数用于获取日期时间中的某个部分。例如:

select extract(year from '2020-07-26') extract,
       extract(year_month from '2020-07-26') extract,
       extract(hour_second from '2020-07-26 12:30:45') extract;
extract|extract|extract|
-------|-------|-------|
   2020| 202007| 123045|

其中,unit 用于指定返回那一部分信息,包括年、月、日、时、分、秒等;完整的取值可以参考官方文档。

YEAR(date) 函数用于返回日期中的年份。例如:

select year('2020-07-26'),year('0000-01-01');
year('2020-07-26')|year('0000-01-01')|
------------------|------------------|
              2020|                 0|

YEARWEEK(date)YEARWEEK(date,mode) 函数返回日期 date 所属的年分和周数。例如:

select yearweek('2020-01-01'),yearweek('2020-01-01', 3);
yearweek('2020-01-01')|yearweek('2020-01-01', 3)|
----------------------|-------------------------|
                201952|                   202001|

参数 mode 决定了每周第一天是星期天还是星期一,以及每一天属于哪一年的第几周。默认情况(mode 为 0)下,2020-01-01 属于 2019 年第 52 周;mode 取值为 3 时,2020-01-01 属于 2020 年第 1 周。关于 mode 参数的具体介绍,参考下文中的 WEEK() 函数。

QUARTER(date) 函数用于返回日期 date 所属的季节,取值返回从 1 到 4。例如:

select quarter('2020-07-26');
quarter('2020-07-26')|
---------------------|
                    3|

MONTH(date) 函数返回日期 date 所在的月份,MONTHNAME(date) 函数用于返回日期 date 所属的月份名称。例如:

select month('2020-07-26'), monthname('2020-07-26');
month('2020-07-26')|monthname('2020-07-26')|
-------------------|-----------------------|
                  7|七月                    |

显示月份名称的语言由系统变量 lc_time_names 控制,中文为“zh_CN”。

WEEK(date[,mode]) 函数用于返回日期 date 属于一年中的第几周,参数 mode 用于控制一周的第一天是星期天还是星期一,以及每一天属于哪一年的第几周。mode 的可能取值和行为如下:

下图是 2020 年 1 月份的日历(星期天为每周的第一天):

以下示例演示了不同 mode 参数的作用:

select week('2020-01-01'), week('2020-01-01', 2), week('2020-01-01', 4), week('2020-01-01', 6);
week('2020-01-01')|week('2020-01-01', 2)|week('2020-01-01', 4)|week('2020-01-01', 6)|
------------------|---------------------|---------------------|---------------------|
                 0|                   52|                    1|                    1|

默认的 mode(0)由系统变量 default_week_format 的值决定,此时 2020-01-01 属于 2020 年的第 0 周;mode 为 2 时 2020-01-01 属于 2019 年的第 52 周;mode 为 4 或者 6 时 2020-01-01 属于 2020 年的第 1 周。

WEEKOFYEAR(date) 函数返回 date 所属的日历周(1-53),等价于 WEEK(date,3) 。

DAYOFYEAR(date) 函数返回 date 是一年中的第几天(1-366),DAY(date)DAYOFMONTH(date) 函数返回 date 属于一月中的第几天(0-31),DAYOFWEEK(date) 函数返回 date 是一星期中的第几天(1 = 星期天)。例如:

select dayofyear('2020-07-26'), dayofmonth('2020-07-26'), dayofweek('2020-07-26');
dayofyear('2020-07-26')|dayofmonth('2020-07-26')|dayofweek('2020-07-26')|
-----------------------|------------------------|-----------------------|
                    208|                      26|                      1|

DAYNAME(date) 函数返回 date 是星期几。例如:

select dayname('2020-07-26');
dayname('2020-07-26')|
---------------------|
星期日                |

显示星期名称的语言由系统变量 lc_time_names 控制,中文为“zh_CN”。

WEEKDAY(date) 函数返回 date 属于一周中的第几天,星期一是 0,星期天是 6。例如:

select weekday('2020-07-26');
weekday('2020-07-26')|
---------------------|
                    6|

LAST_DAY(date) 函数返回 date 所在月份的最后一天。例如:

select last_day('2020-07-26');
last_day('2020-07-26')|
----------------------|
            2020-07-31|

HOUR(time) 函数返回 time 中的小时部分。例如:

select hour('2020-07-26 10:00:00'), hour('30:20:10');
hour('2020-07-26 10:00:00')|hour('30:20:10')|
---------------------------|----------------|
                         10|              30|

MINUTE(time) 函数返回 time 中的分钟。例如:

select minute('2020-07-26 10:20:30'), minute('30:20:10');
minute('2020-07-26 10:20:30')|minute('30:20:10')|
-----------------------------|------------------|
                           20|                20|

SECOND(time) 函数返回 time 中的秒数(0-59),MICROSECOND(expr) 函数返回 time 中的毫秒。例如:

select second('10:20:30'), microsecond('30:20:10.123456');
second('10:20:30')|microsecond('30:20:10.123456')|
------------------|------------------------------|
                30|                        123456|

16.4 将日期时间转换为其他类型

DATE_FORMAT(date,format) 函数将 date 格式化成字符串,参数 format 用于指定格式化字符串;它是 STR_TO_DATE() 的相反函数。例如:

select date_format(now(), '%W %d %M %Y, %r');
date_format(now(), '%W %d %M %Y, %r')|
-------------------------------------|
星期一 27 七月 2020, 03:29:19 AM       |

其中,百分号开始的字符是格式说明符,具体特定的意义。


TIME_FORMAT(time,format) 函数将 time 格式化成字符串,参数 format 用于指定格式化字符串。例如:

select time_format(now(), '%r');
time_format(now(), '%r')|
------------------------|
04:24:49 AM             |

TIME_TO_SEC(time) 函数将 time 转换为秒数。例如:

select time_to_sec('1:00:00');

TO_DAYS(date) 函数返回从第 0 年到 date 以来的天数。例如:

select to_days('2020-07-26'), from_days(737997);
to_days('2020-07-26')|from_days(737997)|
---------------------|-----------------|
               737997|       2020-07-26|

TO_DAYS() 函数和 FROM_DAYS() 函数一样,不支持公历出现之前的日期(1582 年)。

TO_SECONDS(expr) 函数返回从第 0 年到 expr 以来的秒数。例如:

select to_seconds('2020-07-26 00:00:00');
to_seconds('2020-07-26 00:00:00')|
---------------------------------|
                      63762940800|

TO_SECONDS() 函数和 TO_DAYS() 函数一样,不支持公历出现之前的日期(1582 年)。

UNIX_TIMESTAMP([date]) 函数返回 date 对应的 Unix 时间戳(自 ‘1970-01-01 00:00:00’ UTC 以来的秒数),省略参数 date 表示当前时间对应的时间戳。例如:

select unix_timestamp(), unix_timestamp(now());
unix_timestamp()|unix_timestamp(now())|
----------------|---------------------|
      1595796384|           1595796384|

UNIX_TIMESTAMP() 是 FROM_UNIXTIME() 函数的相反操作。

GET_FORMAT({DATE|TIME|DATETIME}, {‘EUR’|‘USA’|‘JIS’|‘ISO’|‘INTERNAL’}) 函数返回指定的格式字符串,通常与 DATE_FORMAT() 和 STR_TO_DATE() 函数一起使用。例如:

select date_format('2020-07-26',get_format(date,'USA')) date_format,
       str_to_date('2020-07-26 20:30:00',GET_FORMAT(DATETIME,'ISO')) str_to_date;
date_format|str_to_date        |
-----------|-------------------|
07.26.2020 |2020-07-26 20:30:00|

第一个 GET_FORMAT() 函数返回了 USA 的日期格式字符串,第二个GET_FORMAT() 函数返回了 ISO 的日期时间格式字符串。

16.5 日期时间的加减运算

ADDDATE(date,INTERVAL expr unit)ADDDATE(expr,days)DATE_ADD(date,INTERVAL expr unit) 函数为日期时间增加一个时间间隔。例如:

select adddate('2020-01-01', interval 1 hour), date_add('2020-01-01', interval 1 hour), adddate('2020-01-01', 1);
adddate('2020-01-01', interval 1 hour)|date_add('2020-01-01', interval 1 hour)|adddate('2020-01-01', 1)|
--------------------------------------|---------------------------------------|------------------------|
2020-01-01 01:00:00                   |2020-01-01 01:00:00                    |2020-01-02              |

参数 INTERVAL expr unit 可以指定不同的时间间隔,具体可以参考官方文档。

SUBDATE(date,INTERVAL expr unit)SUBDATE(expr,days)DATE_SUB(date,INTERVAL expr unit) 函数从日期时间中减去一个时间间隔。例如:

select subdate('2020-01-01', interval 1 day), subdate('2020-01-01', 1), date_sub('2020-01-01', interval 1 day);
subdate('2020-01-01', interval 1 day)|subdate('2020-01-01', 1)|date_sub('2020-01-01', interval 1 day)|
-------------------------------------|------------------------|--------------------------------------|
2019-12-31                           |2019-12-31              |2019-12-31                            |

日期时间数据也可以使用 + 或者 - 直接进行加减运算。例如:

select '2020-01-01' + interval 1 day, '2020-01-01 10:00:00' - interval 1 hour;
'2020-01-01' + interval 1 day|'2020-01-01 10:00:00' - interval 1 hour|
-----------------------------|---------------------------------------|
2020-01-02                   |2020-01-01 09:00:00                    |

ADDTIME(expr1,expr2) 函数为 expr1 增加指定的时间 expr2,SUBTIME(expr1,expr2) 为 expr1 减去指定的时间 expr2。例如:

select addtime('2020-01-01 00:00:00', '10:00:00'), subtime('10:00:00', '10:00:00');
addtime('2020-01-01 00:00:00', '10:00:00')|subtime('10:00:00', '10:00:00')|
------------------------------------------|-------------------------------|
2020-01-01 10:00:00                       |00:00:00                       |

PERIOD_ADD(P,N) 函数为一个时间段 P(不是 date 类型)增加指定的月数,返回格式为 YYYYMM。例如:

select period_add(202001, 6);
period_add(202001, 6)|
---------------------|
               202007|

TIMESTAMPADD(unit,interval,datetime_expr) 函数为 datetime_expr 增加一个指定的时间间隔。例如:

select timestampadd(day, 1, '2020-07-26'), timestampadd(minute, 10, '2020-07-26');

unit 用于指定时间间隔的单位,可以为 MICROSECOND、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 或者 YEAR。

DATEDIFF(expr1,expr2) 函数计算两个日期之间的天数(expr1 ? expr2)。例如:

select datediff('2020-01-02','2020-01-01'), datediff('2020-01-02 00:00:00','2020-01-01 23:59:59');
datediff('2020-01-02','2020-01-01')|datediff('2020-01-02 00:00:00','2020-01-01 23:59:59')|
-----------------------------------|-----------------------------------------------------|
                                  1|                                                    1|

datetime 类型中的时间部分不参与计算。

PERIOD_DIFF(P1,P2) 函数返回两个时间段(P1 和 P2 不是 date 类型)之间相差的月数(P1-P2)。例如:

select period_diff(000002, 000001);
period_diff(000002, 000001)|
---------------------------|
                          1|

TIMEDIFF(expr1,expr2) 函数计算两个时间点之间相差的时间(expr1-expr2)。例如:

select timediff('2020-07-26 23:59:59', '2020-07-25 00:00:00');
timediff('2020-07-26 23:59:59', '2020-07-25 00:00:00')|
------------------------------------------------------|
                                              47:59:59|

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2) 函数返回两个日期时间之间相差的时间间隔(datetime_expr2 ? datetime_expr1),unit 用于指定时间间隔的单位,可以为 MICROSECOND、SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER 或者 YEAR。例如:

select timestampdiff(second,'1970-01-01 08:00:00', '2020-07-26'), unix_timestamp('2020-07-26');
timestampdiff(second,'1970-01-01 08:00:00', '2020-07-26')|unix_timestamp('2020-07-26')|
---------------------------------------------------------|----------------------------|
                                               1595692800|                  1595692800|

16.6 时区转换

CONVERT_TZ(dt,from_tz,to_tz) 函数用于将日期时间从一个时区转换为另一个时区。例如:

select convert_tz('2020-07-26 00:00:00','+00:00','+08:00');
convert_tz('2020-07-26 00:00:00','+00:00','+08:00')|
---------------------------------------------------|
                                2020-07-26 08:00:00|

CONVERT_TZ() 函数也支持使用名称指定时区,相关的设置可以参考官方文档。


对了,在这里说一下,我目前是在职Java开发,如果你现在正在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中缺乏基础入门的视频教程,可以关注并私信我:01。获取。我这里有最新的Java基础全套视频教程。

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...