百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

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

connygpt 2024-10-25 11:34 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基础全套视频教程。

相关推荐

3分钟让你的项目支持AI问答模块,完全开源!

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...

干货|程序员的副业挂,12个平台分享

1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...

Github标星超200K,这10个可视化面板你知道几个

在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...

开箱即用的炫酷中后台前端开源框架第二篇

#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...

搭建React+AntDeign的开发环境和框架

搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...

基于.NET 5实现的开源通用权限管理平台

??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...

StreamPark - 大数据流计算引擎

使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...

教你使用UmiJS框架开发React

1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...

简单在线流程图工具在用例设计中的运用

敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...

【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单

这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...

聊聊规则引擎的调研及实现全过程

摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...

【开源推荐】Diboot 2.0.5 发布,自动化开发助理

一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...

微软推出Copilot Actions,使用人工智能自动执行重复性任务

IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...

Electron 使用Selenium和WebDriver

本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...

Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具

一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...