Msyql日期时间总结
学习链接
时间掌控者:精修MySQL中的时间函数艺术
Mysql 中的日期时间函数汇总1
Mysql 中的日期时间函数汇总2
文章目录
- 学习链接
- 基础篇
- 一、MySQL时间函数概览
- 获取当前时间
- 格式化时间
- 提取日期和时间部分
- 计算日期和时间间隔
- 添加和减去时间间隔
- 时间转换
- 二、日期和时间的表示方法
- 2.1 MySQL中日期和时间的存储格式
- 2.2 如何正确插入不同类型的日期和时间值
- 三、常用的MySQL时间函数
- 3.1 当前时间的获取
- 3.2 日期和时间的提取
- 3.3 日期和时间的转换
- 3.4 计算时间差
- 3.5 时间戳和日期的转换
- 四、时间函数的实际应用案例
- 查询当前时间
- 查询某一日期之前或之后的日期
- 比较日期或时间
- 格式化日期或时间的显示
- 计算日期或时间差异
- 根据当前时间进行条件查询
- 五、注意事项
- 5.1 时间区域设置对时间函数的影响
- Mysql 中的日期时间函数汇总(1)
- 1 CURDATE()函数
- 2 CURTIME()函数
- 3 NOW()函数
- 4 UNIX\_TIMESTAMP(date)函数
- 5 FROM\_UNIXTIME(timestamp)函数
- 6 UTC\_DATE()函数
- 7 UTC\_TIME()函数
- 8 YEAR(date)函数
- 9 MONTH(date)函数
- 10 MONTHNAME(date)函数
- 11 DAY(date)函数
- 12 DAYNAME(date)函数
- 13 DAYOFWEEK(date)函数
- 14 WEEKDAY(date)函数
- 15 WEEK(date)函数
- 16 WEEKOFYEAR(date)函数
- 17 DAYOFYEAR(date)函数
- 18 DAYOFMONTH(date)函数
- 19 QUARTER(date)函数
- 20 HOUR(time)函数
- 21 MINUTE(time)函数
- 22 SECOND(time)函数
- 23 EXTRACT(type FROM date)函数
- 24 TIME\_TO\_SEC(time)函数
- 25 SEC\_TO\_TIME(seconds)函数
- 26 DATE\_ADD(date,INTERVAL expr type)函数
- 27 DATE\_SUB(date,INTERVAL expr type)函数
- 28 ADDTIME(time1,time2)函数
- 29 SUBTIME(time1,time2)函数
- 30 DATEDIFF(date1,date2)函数
- 31 FROM\_DAYS(N)函数
- 32 LAST\_DAY(date)函数
- 33 MAKEDATE(year,n)函数
- 34 MAKETIME(hour,minute,second)函数
- 35 PERIOD\_ADD(time,n)函数
- 36 TO\_DAYS(date)函数
- 37 DATE\_FORMAT(date,format)函数
- 38 TIME\_FORMAT(time,format)函数
- 39 GET\_FORMAT(date\_type,format\_type)函数
- 40 STR\_TO\_DATE(str,format)函数
- Mysql 中的日期时间函数汇总(2)
- 获取当前日期和时间
- 日期时间格式化与转换
- 日期时间计算(加减)
- 日期时间部分提取
- 时间戳转换
- 其他有用的函数
- 附录
- 获取本月第一天
- 查询今日、昨日、周、上月、本月数据
基础篇
一、MySQL时间函数概览
MySQL提供了一组内置的时间函数,用于处理和操作日期和时间数据。这些时间函数可以在查询中使用,以执行各种与时间相关的操作。
MySQL时间函数的主要有以下作用:
获取当前时间
格式化时间
提取日期和时间部分
计算日期和时间间隔
添加和减去时间间隔
时间转换
二、日期和时间的表示方法
2.1 MySQL中日期和时间的存储格式
在MySQL中,日期和时间可以使用多种存储格式来表示。以下是MySQL中常用的日期和时间存储格式:
数据类型 | 存储格式 | 示例 | 中文说明 |
---|---|---|---|
DATE | YYYY-MM-DD | 2021-09-15 | 日期,表示年、月、日 |
TIME | HH:MM:SS | 09:30:45 | 时间,表示小时、分钟、秒 |
DATETIME | YYYY-MM-DD HH:MM:SS | 2021-09-15 09:30:45 | 日期和时间的组合,表示年、月、日、小时、分钟、秒 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 2021-09-15 09:30:45 | 时间戳,表示从1970年1月1日到2038年1月19日的时间范围 |
YEAR | YYYY | 2021 | 年份,表示年份值 |
2.2 如何正确插入不同类型的日期和时间值
在MySQL中,不同类型的日期和时间,需要输入不同的值,我们必须掌握正确的输入方法,才能保证程序的健壮性,下面我们具体看看不同的类型如何输入:
- DATE:日期值可以使用’YYYY-MM-DD’的格式输入。
- 例如,要插入2024年3月15日,可以使用以下语句:
INSERT INTO test_date (date_column) VALUES ('2024-03-15');
-
TIME:时间值可以使用’HH:MM:SS’的格式输入。
- 例如,要插入上午17点58分45秒的时间,可以使用以下语句:
INSERT INTO test_time (time_column) VALUES ('17:58:45');
-
DATETIME:日期和时间值可以使用’YYYY-MM-DD HH:MM:SS’的格式输入。
- 例如,要插入2024年3月15日上午17点58分45秒的日期和时间,可以使用以下语句:
INSERT INTO test_datetime (datetime_column) VALUES ('2024-03-15 17:58:45');
-
TIMESTAMP:对于时区敏感的时间戳,可以使用’YYYY-MM-DD HH:MM:SS’的格式输入。MySQL会自动将其转换为UTC时间进行存储。
- 例如,要插入当前日期和时间作为时间戳,可以使用以下语句:
-- 获取系统当前的时间戳
INSERT INTO test_timestamp (timestamp_column) VALUES (CURRENT_TIMESTAMP);-- 转换代码获取的时间戳
INSERT INTO test_timestamp (timestamp_column) VALUES (FROM_UNIXTIME(1710496924));
反例:
INSERT INTO test_timestamp (timestamp_column) VALUES (1710496924389);
-- 上面插入的方法将得到一个0000-00-00 00:00:00的错误值
-
YEAR:年份值应使用’YYYY’的格式输入。
- 例如,要插入2024年的年份值,可以使用以下语句:
INSERT INTO test_year (year_column) VALUES (2024);
三、常用的MySQL时间函数
3.1 当前时间的获取
3.2 日期和时间的提取
在MySQL中,可以使用函数来提取日期和时间的特定部分,这些函数可以根据您的需要灵活运用,以提取日期和时间的特定部分或按照特定的格式进行格式化。
日期和时间的提取函数可以的分为简单提取
和复杂提取
,具体提取函数使用语法和效果如下图所示:
3.3 日期和时间的转换
MySQL提供了一些函数来进行日期和时间的转换,方便能够在不同的格式之间进行转换。
- 以下是一些常用的日期和时间转换函数:
-
MySQL 中还有用于将日期和时间从一个时区转换到另一个时区的函数
CONVERT_TZ(datetime, from_tz, to_tz)
-
datetime
:要转换的日期时间值。 -
from_tz
:要转换的日期时间值的当前时区。 -
to_tz
:要转换为的目标时区。
-
使用案例:
SELECT CONVERT_TZ('2024-03-14 23:30:00', 'Asia/Shanghai', 'America/New_York');
-- 执行结果:2024-03-14 11:30:00
注意:要使用
CONVERT_TZ(datetime, from_tz, to_tz)
函数,需要保证mysql的时区设置、时区数据和函数参数,确保它们都正确无误。
3.4 计算时间差
MySQL提供了几个函数用于计算日期和时间之间的差异,具体情况如下:
注意,在使用这些函数时,确保日期和时间的格式正确,并根据需要进行适当的转换和处理。
3.5 时间戳和日期的转换
在MySQL中,提供了两种函数进行时间戳和日期的转换,具体使用方法如下:
FROM_UNIXTIME(unix_timestamp, [format])
:将UNIX时间戳转换为日期时间格式。可选择性地指定输出的日期时间格式。
示例:
SELECT FROM_UNIXTIME(1631699445);
-- 2024-03-16 08:15:50SELECT FROM_UNIXTIME(1631699445, '%Y-%m-%d %H:%i:%s');
-- 2024-03-16 08:15:50
UNIX_TIMESTAMP([date])
:将日期时间值转换为对应的UNIX时间戳。
示例:
SELECT UNIX_TIMESTAMP('2024-03-16 08:18:50');
-- 1710595130
四、时间函数的实际应用案例
MySQL的时间函数在实际查询中有许多使用场景。我们一起看看常见的应用场景:
查询当前时间
查询某一日期之前或之后的日期
比较日期或时间
格式化日期或时间的显示
计算日期或时间差异
根据当前时间进行条件查询
注意:以上内容仅仅是MySQL时间函数的一小部分应用场景。实际开发中可以根据具体的需求和业务逻辑,将时间函数与其他查询条件、聚合函数等结合使用,以实现更复杂的查询和计算需求。
五、注意事项
5.1 时间区域设置对时间函数的影响
MySQL的时间区域设置对时间函数的影响是非常重要的,因为它确定了MySQL如何解释和处理日期、时间和时区相关的数据。
以下是时间区域设置对时间函数的影响的几个方面:
-
时区的默认值:MySQL的时间函数会使用默认的时区设置来解释和处理日期、时间数据。如果未显式设置时区,则使用系统全局时区作为默认值。例如,
CURRENT_TIMESTAMP()
函数将返回当前系统时区下的日期时间值。 -
时区的影响:某些时间函数的结果可能会受到时区设置的影响。例如,
NOW()
函数返回当前日期和时间,它受到系统时区的影响。如果时区设置为Asia/Shanghai
,那么在芝加哥时区的服务器上调用NOW()
函数将返回与在北京时区的服务器上调用NOW()
函数不同的结果。 -
时区转换函数:MySQL提供了一些函数用于在不同的时区之间进行转换,例如
CONVERT_TZ()
函数。这些函数依赖于时区设置和时区数据,以正确地执行时区转换操作。 -
时区偏移:某些函数返回的结果可能包含时区偏移信息。例如,
TIMESTAMP
类型的列存储的是不带时区的日期时间值,但在从数据库中检索出来时,MySQL会将其转换为当前时区的日期时间值,并根据需要添加时区偏移。
Mysql 中的日期时间函数汇总(1)
1 CURDATE()函数
CURDATE()函数用于返回当前日期,只包含年、月、日部分,格式为YYYY-MM-DD。使用示例如下:
mysql> SELECT CURDATE();
+------------+
| CURDATE() |
+------------+
| 2019-12-11 |
+------------+
1 row in set (0.00 sec)
CURRENT_DATE()函数的作用与CURDATE()函数相同,不再赘述。
2 CURTIME()函数
CURTIME()函数用于返回当前时间,只包含时、分、秒部分,格式为HH:MM:SS。使用示例如下:
mysql> SELECT CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 11:27:44 |
+-----------+
1 row in set (0.00 sec)
CURRENT_TIME()函数的作用与CURTIME函数相同,不再赘述。
3 NOW()函数
NOW()函数用于返回当前日期和时间,包含年、月、日、时、分、秒,格式为YYYY-MM-DD HH:MM:SS。使用示例如下:
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2019-12-15 11:29:22 |
+---------------------+
1 row in set (0.00 sec)
CURRENT_TIMESTAMP()函数、LOCALTIME()函数、LOCALTIMESTAMP()函数、SYSDATE()函数的作用与NOW()函数相同,不再赘述。
4 UNIX_TIMESTAMP(date)函数
将date转化为UNIX时间戳。使用示例如下:
mysql> SELECT UNIX_TIMESTAMP(now());
+-----------------------+
| UNIX_TIMESTAMP(now()) |
+-----------------------+
| 1576380910 |
+-----------------------+
1 row in set (0.01 sec)
mysql> SELECT UNIX_TIMESTAMP(CURDATE());
+---------------------------+
| UNIX_TIMESTAMP(CURDATE()) |
+---------------------------+
| 1576339200 |
+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT UNIX_TIMESTAMP(CURTIME());
+---------------------------+
| UNIX_TIMESTAMP(CURTIME()) |
+---------------------------+
| 1576380969 |
+---------------------------+
1 row in set (0.00 sec)
5 FROM_UNIXTIME(timestamp)函数
FROM_UNIXTIME(timestamp)函数将UNIX时间戳转化为日期时间,格式为YYYY-MM-DD HH:MM:SS,与UNIX_TIMESTAMP(date)函数互为反函数。使用示例如下:
mysql> SELECT FROM_UNIXTIME(1576380910);
+---------------------------+
| FROM_UNIXTIME(1576380910) |
+---------------------------+
| 2019-12-15 11:35:10 |
+---------------------------+
1 row in set (0.00 sec)
6 UTC_DATE()函数
UTC_DATE()函数用于返回UTC日期。使用示例如下:
mysql> SELECT UTC_DATE();
+------------+
| UTC_DATE() |
+------------+
| 2019-12-15 |
+------------+
1 row in set (0.00 sec)
也可以返回YYYYMMDD格式的日期。使用示例如下:
mysql> SELECT UTC_DATE()+0;
+--------------+
| UTC_DATE()+0 |
+--------------+
| 20191215 |
+--------------+
1 row in set (0.00 sec)
7 UTC_TIME()函数
UTC_TIME()函数用于返回UTC时间。使用示例如下:
mysql> SELECT UTC_TIME();
+------------+
| UTC_TIME() |
+------------+
| 06:39:00 |
+------------+
1 row in set (0.00 sec)
8 YEAR(date)函数
YEAR(date)函数用于返回日期所在的年份,取值返回为1970~2069。使用示例如下:
mysql> SELECT YEAR(NOW());
+-------------+
| YEAR(NOW()) |
+-------------+
| 2019 |
+-------------+
1 row in set (0.00 sec)
注意:00~69会被转化为2000~2069,70~99会被转化为1970~1999。
9 MONTH(date)函数
MONTH(date)函数用于返回日期对应的月份,取值返回为1~12。使用示例如下:
mysql> SELECT MONTH(NOW());
+--------------+
| MONTH(NOW()) |
+--------------+
| 12 |
+--------------+
1 row in set (0.00 sec)
10 MONTHNAME(date)函数
MONTHNAME(date)函数用于返回日期所在月份的英文名称。使用示例如下:
mysql> SELECT MONTHNAME(NOW());
+------------------+
| MONTHNAME(NOW()) |
+------------------+
| December |
+------------------+
1 row in set (0.00 sec)
11 DAY(date)函数
DAY(date)函数只返回日期。使用示例如下:
mysql> SELECT DAY(NOW());
+------------+
| DAY(NOW()) |
+------------+
| 15 |
+------------+
1 row in set (0.00 sec)
12 DAYNAME(date)函数
DAYNAME(date)函数用于返回日期对应星期的英文名称。使用示例如下:
mysql> SELECT DAYNAME(NOW());
+----------------+
| DAYNAME(NOW()) |
+----------------+
| Sunday |
+----------------+
1 row in set (0.00 sec)
mysql> SELECT DAYNAME('2020-01-01');
+-----------------------+
| DAYNAME('2020-01-01') |
+-----------------------+
| Wednesday |
+-----------------------+
1 row in set (0.00 sec)
13 DAYOFWEEK(date)函数
DAYOFWEEK(date)函数用于返回日期对应的一周中的索引值。1表示星期日,2表示星期一,以此类推。使用示例如下:
mysql> SELECT DAYOFWEEK(NOW());
+------------------+
| DAYOFWEEK(NOW()) |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
mysql> SELECT DAYOFWEEK('2020-01-01');
+-------------------------+
| DAYOFWEEK('2020-01-01') |
+-------------------------+
| 4 |
+-------------------------+
1 row in set (0.00 sec)
14 WEEKDAY(date)函数
WEEKDAY(date)函数返回日期对应的一周中的索引值。0表示星期一,1表示星期二,以此类推。使用示例如下:
mysql> SELECT WEEKDAY(NOW());
+----------------+
| WEEKDAY(NOW()) |
+----------------+
| 6 |
+----------------+
1 row in set (0.00 sec)
mysql> SELECT WEEKDAY('2020-01-01');
+-----------------------+
| WEEKDAY('2020-01-01') |
+-----------------------+
| 2 |
+-----------------------+
1 row in set (0.00 sec)
15 WEEK(date)函数
WEEK(date)函数返回给定日期是一年中的第几周。使用示例如下:
mysql> SELECT WEEK(NOW());
+-------------+
| WEEK(NOW()) |
+-------------+
| 50 |
+-------------+
1 row in set (0.00 sec)
16 WEEKOFYEAR(date)函数
WEEKOFYEAR(date)函数返回日期位于一年中的第几周。使用示例如下:
mysql> SELECT WEEKOFYEAR(NOW());
+-------------------+
| WEEKOFYEAR(NOW()) |
+-------------------+
| 50 |
+-------------------+
1 row in set (0.00 sec)
17 DAYOFYEAR(date)函数
DAYOFYEAR(date)函数返回日期是一年中的第几天。使用示例如下:
mysql> SELECT DAYOFYEAR(NOW());
+------------------+
| DAYOFYEAR(NOW()) |
+------------------+
| 349 |
+------------------+
1 row in set (0.00 sec)
18 DAYOFMONTH(date)函数
DAYOFMONTH(date)函数返回日期位于所在月份的第几天。使用示例如下:
mysql> SELECT DAYOFMONTH(NOW());
+-------------------+
| DAYOFMONTH(NOW()) |
+-------------------+
| 15 |
+-------------------+
1 row in set (0.00 sec)
19 QUARTER(date)函数
QUARTER(date)函数返回日期对应的季度,范围为1~4。使用示例如下:
mysql> SELECT QUARTER(NOW());
+----------------+
| QUARTER(NOW()) |
+----------------+
| 4 |
+----------------+
1 row in set (0.00 sec)
20 HOUR(time)函数
HOUR(time)函数返回指定时间的小时。使用示例如下:
mysql> SELECT HOUR(NOW());
+-------------+
| HOUR(NOW()) |
+-------------+
| 11 |
+-------------+
1 row in set (0.00 sec)
21 MINUTE(time)函数
MINUTE(time)函数返回指定时间的分钟,取值范围0~59。使用示例如下:
mysql> SELECT MINUTE(NOW());
+---------------+
| MINUTE(NOW()) |
+---------------+
| 45 |
+---------------+
1 row in set (0.00 sec)
22 SECOND(time)函数
SECOND(time)函数返回指定时间的秒数,取值范围0~59。使用示例如下:
mysql> SELECT SECOND(NOW());
+---------------+
| SECOND(NOW()) |
+---------------+
| 22 |
+---------------+
1 row in set (0.00 sec)
23 EXTRACT(type FROM date)函数
EXTRACT(type FROM date)函数返回指定日期中特定的部分,type指定返回的值。其中,type的取值如表11-1所示。
表11-1 EXTRACT(type FROM date)函数中type的取值与含义
注意:当EXTRACT(type FROM date)函数中的type取值为MINUTE_SECOND时,表示返回分钟和秒值,当date中的分钟为12,秒为12时,返回的结果为1212。也就是说,将分钟后面直接拼接上秒值。type取值为其他带有下划线的值时,也遵循同样的规律。
使用示例如下:
mysql> SELECT EXTRACT(HOUR_MINUTE FROM NOW());
+---------------------------------+
| EXTRACT(HOUR_MINUTE FROM NOW()) |
+---------------------------------+
| 2142 |
+---------------------------------+
1 row in set (0.00 sec)
24 TIME_TO_SEC(time)函数
TIME_TO_SEC(time)函数将time转化为秒并返回结果值。转化的公式为:小时*3600+分钟*60+秒。使用示例如下:
mysql> SELECT TIME_TO_SEC(NOW());
+--------------------+
| TIME_TO_SEC(NOW()) |
+--------------------+
| 78774 |
+--------------------+
1 row in set (0.00 sec)
25 SEC_TO_TIME(seconds)函数
SEC_TO_TIME(seconds)函数将seconds描述转化为包含小时、分钟和秒的时间。使用示例如下:
mysql> SELECT SEC_TO_TIME(78774);
+--------------------+
| SEC_TO_TIME(78774) |
+--------------------+
| 21:52:54 |
+--------------------+
1 row in set (0.12 sec)
26 DATE_ADD(date,INTERVAL expr type)函数
DATE_ADD(date,INTERVAL expr type)函数返回与date相差INTERVAL时间间隔的日期,本质上是日期的加操作。该函数中的type是间隔的类型,间隔类型如表11-2所示。
表11-2 DATE_ADD(date,INTERVAL expr type)函数中type的取值
使用示例如下:
mysql> SELECT DATE_ADD(NOW(), INTERVAL 1 DAY);
+---------------------------------+
| DATE_ADD(NOW(), INTERVAL 1 DAY) |
+---------------------------------+
| 2019-12-16 22:04:36 |
+---------------------------------+
1 row in set (0.00 sec)
ADDDATE(date,INTERVAL expr type)函数与DATE_ADD(date,INTERVAL expr type)函数的作用相同,不再赘述。
27 DATE_SUB(date,INTERVAL expr type)函数
DATE_SUB(date,INTERVAL expr type)函数返回与date相差INTERVAL时间间隔的日期,本质上是日期的减操作,其中type的取值见表11-2。使用示例如下:
mysql> SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
+---------------------------------+
| DATE_SUB(NOW(), INTERVAL 1 DAY) |
+---------------------------------+
| 2019-12-14 22:09:10 |
+---------------------------------+
1 row in set (0.00 sec)
SUBDATE(date,INTERVAL expr type)函数与DATE_SUB(date,INTERVAL expr type)函数作用相同,不再赘述。
注意:DATE_ADD、ADDDATE、DATE_SUB和SUBDATE这4个函数均可以指定负值。
28 ADDTIME(time1,time2)函数
ADDTIME(time1,time2)函数返回time1加上time2的时间。其中,time2是一个表达式,也可以是一个数字,当time2为一个数字时,代表的是秒。使用示例如下:
mysql> SELECT ADDTIME(NOW(), 50);
+---------------------+
| ADDTIME(NOW(), 50) |
+---------------------+
| 2019-12-15 22:17:47 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT ADDTIME(NOW(), '1:1:1');
+-------------------------+
| ADDTIME(NOW(), '1:1:1') |
+-------------------------+
| 2019-12-15 23:18:46 |
+-------------------------+
1 row in set (0.00 sec)
ADDTIME(NOW(),‘1:1:1’)表示的含义为返回为当前时间加上1小时1分1秒之后的时间。
ADDTIME(time1,time2)函数中的time2的值也可以为负值。
mysql> SELECT ADDTIME(NOW(), '-1:-1:-1');
+----------------------------+
| ADDTIME(NOW(), '-1:-1:-1') |
+----------------------------+
| 2019-12-15 22:19:29 |
+----------------------------+
1 row in set, 1 warning (0.01 sec)
ADDTIME(NOW(),'-1:-1:-1')
表示的含义为返回当前时间减去1小时1分1秒之后的时间。
29 SUBTIME(time1,time2)函数
SUBTIME(time1,time2)函数返回time1减去time2后的时间。其中,time2是一个表达式,也可以是一个数字,当time2为一个数字时,代表的是秒。使用示例如下:
mysql> SELECT SUBTIME(NOW(), 50);
+---------------------+
| SUBTIME(NOW(), 50) |
+---------------------+
| 2019-12-15 22:23:35 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT SUBTIME(NOW(), '1:1:1');
+-------------------------+
| SUBTIME(NOW(), '1:1:1') |
+-------------------------+
| 2019-12-15 21:23:50 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT SUBTIME(NOW(), '-1:-1:-1');
+----------------------------+
| SUBTIME(NOW(), '-1:-1:-1') |
+----------------------------+
| 2019-12-15 22:25:11 |
+----------------------------+
1 row in set, 1 warning (0.00 sec)
30 DATEDIFF(date1,date2)函数
DATEDIFF(date1,date2)函数计算两个日期之间相差的天数。使用示例如下:
mysql> SELECT DATEDIFF(NOW(), '1970-01-01');
+-------------------------------+
| DATEDIFF(NOW(), '1970-01-01') |
+-------------------------------+
| 18245 |
+-------------------------------+
1 row in set (0.00 sec)
31 FROM_DAYS(N)函数
FROM_DAYS(N)函数返回从0000年1月1日起,N天以后的日期。使用示例如下:
mysql> SELECT FROM_DAYS(366);
+----------------+
| FROM_DAYS(366) |
+----------------+
| 0001-01-01 |
+----------------+
1 row in set (0.00 sec)
32 LAST_DAY(date)函数
LAST_DAY(date)函数返回date所在月份的最后一天的日期。使用示例如下:
mysql> SELECT LAST_DAY(NOW());
+-----------------+
| LAST_DAY(NOW()) |
+-----------------+
| 2019-12-31 |
+-----------------+
1 row in set (0.00 sec)
33 MAKEDATE(year,n)函数
MAKEDATE(year,n)函数针对给定年份与所在年份中的天数返回一个日期。使用示例如下:
mysql> SELECT MAKEDATE(2020,1);
+------------------+
| MAKEDATE(2020,1) |
+------------------+
| 2020-01-01 |
+------------------+
1 row in set (0.00 sec)
mysql> SELECT MAKEDATE(2020,32);
+-------------------+
| MAKEDATE(2020,32) |
+-------------------+
| 2020-02-01 |
+-------------------+
1 row in set (0.00 sec)
34 MAKETIME(hour,minute,second)函数
将给定的小时、分钟和秒组合成时间并返回。使用示例如下:
mysql> SELECT MAKETIME(1,1,1);
+-----------------+
| MAKETIME(1,1,1) |
+-----------------+
| 01:01:01 |
+-----------------+
1 row in set (0.00 sec)
35 PERIOD_ADD(time,n)函数
PERIOD_ADD(time,n)函数返回time加上n后的时间。使用示例如下:
mysql> SELECT PERIOD_ADD(20200101010101,1);
+------------------------------+
| PERIOD_ADD(20200101010101,1) |
+------------------------------+
| 20200101010102 |
+------------------------------+
1 row in set (0.00 sec)
36 TO_DAYS(date)函数
TO_DAYS(date)函数返回日期date距离0000年1月1日的天数。使用示例如下:
mysql> SELECT TO_DAYS(NOW());
+----------------+
| TO_DAYS(NOW()) |
+----------------+
| 737773 |
+----------------+
1 row in set (0.00 sec)
37 DATE_FORMAT(date,format)函数
DATE_FORMAT(date,format)函数按照指定的格式format来格式化日期date。其中,format常用的格式符如表11-3所示。
表11-3 DATE_FORMAT(date,format)函数中format常用的格式符
使用示例如下:
mysql> SELECT DATE_FORMAT(NOW(), '%H:%i:%s');
+--------------------------------+
| DATE_FORMAT(NOW(), '%H:%i:%s') |
+--------------------------------+
| 22:57:34 |
+--------------------------------+
1 row in set (0.00 sec)
38 TIME_FORMAT(time,format)函数
TIME_FORMAT(time,format)函数按照指定的格式format来格式化日期date。其中,format常用的格式符见表11-3。使用示例如下:
mysql> SELECT TIME_FORMAT(NOW(), '%H:%i:%s');
+--------------------------------+
| TIME_FORMAT(NOW(), '%H:%i:%s') |
+--------------------------------+
| 22:59:40 |
+--------------------------------+
1 row in set (0.00 sec)
39 GET_FORMAT(date_type,format_type)函数
GET_FORMAT(date_type,format_type)函数返回日期字符串的显示格式,其中date_type表示日期类型,format_type表示格式化类型。日期类型与格式化类型的取值如表11-4所示。
表11-4 GET_FORMAT函数返回的格式化字符串
使用示例如下:
mysql> SELECT GET_FORMAT(DATE, 'USA');
+-------------------------+
| GET_FORMAT(DATE, 'USA') |
+-------------------------+
| %m.%d.%Y |
+-------------------------+
1 row in set (0.00 sec)
40 STR_TO_DATE(str,format)函数
STR_TO_DATE(str,format)函数将字符串str按照format格式转化为日期或时间。其中,format的取值见表11-3。使用示例如下:
mysql> SELECT STR_TO_DATE('2020-01-01 00:00:00','%Y-%m-%d');
+-----------------------------------------------+
| STR_TO_DATE('2020-01-01 00:00:00','%Y-%m-%d') |
+-----------------------------------------------+
| 2020-01-01 |
+-----------------------------------------------+
1 row in set, 1 warning (0.00 sec)
Mysql 中的日期时间函数汇总(2)
获取当前日期和时间
获取当前时刻的时间就是获取程序运行的那一刻与时间相关的数据,比如年月日、时分秒等信息。
序号 | 函数 | 简要说明 |
---|---|---|
1 | now() | 用于获取当前的日期和时间,其返回值格式为 YYYY-MM-DD HH:MM:SS 。该函数在整个查询过程中保持不变,可以确保所有记录的时间戳一致,因此被广泛用于记录数据的创建时间或更新时间。 |
2 | curdate() | 用于获取当前的日期,其返回值格式为 YYYY-MM-DD 。该函数在需要仅获取日期信息时非常有用,因为它可以避免对时间部分的额外处理。 |
3 | curtime() | 用于获取当前的时间,其返回值格式为 HH:MM:SS 。该函数在需要仅获取时间信息时非常有用,例如在记录事件发生的具体时间或计算时间间隔时。 |
4 | current_timestamp() | 用于获取当前的日期和时间,其返回值格式为 YYYY-MM-DD HH:MM:SS 。 |
5 | sysdate() | 用于获取执行时的日期和时间。 |
INSERT INTO orders (order_id, order_time) VALUES (1, NOW());
SELECT COUNT(*) FROM sales WHERE sale_date = CURDATE();
SELECT CURTIME();
日期时间格式化与转换
我们知道同一个日期时间会有多种不同的表示方式,有的时候需要在不同格式之间相互转换。在 MySQL 中,可以使用日期函数将日期和时间数据从一种格式转换为另一种格式,以下是一些常用的日期格式转换函数:
序号 | 函数 | 简要说明 |
---|---|---|
1 | date_format(datetime,format) | 用于将日期和时间值按照指定的格式进行格式化,其返回值为一个字符串,在需要将日期和时间以特定格式展示时非常有用。该函数支持多种格式化选项,可以根据需求灵活定制日期时间的显示格式。 |
2 | time_format(time,format) | 按照指定的格式format来格式化日期date |
3 | STR_TO_DATE(str, format) | 用于将字符串转换为日期或日期时间值,其返回值为一个日期或日期时间值,在需要将非标准格式的字符串日期转换为标准的日期格式时非常有用。 |
4 | FROM_DAYS() | 将天数转换为日期 |
5 | TIME_TO_SEC(time) | 将time转化为秒并返回结果值,转化的公式为:小时*3600 + 分钟*60 + 秒。 |
6 | SEC_TO_TIME(seconds) | 将seconds描述转化为包含小时、分钟和秒的时间 |
在上述方法中,其中 datetime 表示要被转换的具体的日期时间,format 表示要转换成的格式,可选的格式如下:
格式 | 描述 | 格式 | 描述 | 格式 | 描述 |
---|---|---|---|---|---|
%Y | 4位数的年 | %T | 返回当前的时分秒, 24-小时 (hh:mm:ss) | ||
%b | 月份对应的英文缩写 | %M | 月份对应的英文全称 | %m | 01-12的月 |
%c | 1-12的月份数值 | %d | 01-31的某月里面的第几天 | %e | 1-31的某月里面的第几天 |
%D | 用th后缀表示某月中的第几天 | %j | 001-366的一年中的第几天 | %a | 星期几对应的英文缩写 |
%W | 星期几对应的英文全称 | %H | 00-23的小时 | %h | 01-12的小时 |
%i | 00-59的分钟 | %S | 秒(00-59) | %f | 微秒 |
SELECT DATE_FORMAT('2022-11-09 12:34:56', '%Y-%m-%d %H:%i:%s');
日期时间计算(加减)
有的时候我们也需要对日期之间进行运算,比如要获取今天往前7天对应的日期,或者今天往后13天对应的日期,可以去翻日历,也可以去数数,但是这些方法肯定都不是最直接的方法,所以需要日期之间的运算。MySQL 提供了一些日期函数,可以使用这些函数来执行日期加法、日期减法等操作。以下是一些常用的日期计算函数:
序号 | 函数 | 简要说明 |
---|---|---|
1 | date_add(date, INTERVAL num unit) | 用于在日期上添加指定的时间间隔,其返回值为一个新的日期值,常用于计算未来的日期。 |
2 | ADDDATE(date, INTERVAL num unit) | 在日期上加上指定的时间间隔。 |
3 | ADDTIME(time1,time2) | 返回time1加上time2的时间 |
4 | date_sub(date, INTERVAL num unit) | 用于从日期中减去指定的时间间隔,其返回值为一个新的日期值,常用于计算过去的日期。 |
5 | SUBDATE(date, INTERVAL num unit) | 从日期中减去指定的时间间隔。 |
6 | SUBTIME(time1,time2) | 返回time1减去time2后的时间。 |
7 | datediff(date1,date2) | 用于计算两个日期之间的天数差,其返回值为一个整数,表示两个日期之间的天数差,常用于计算时间间隔,例如任务的持续时间等。 |
8 | TIMEDIFF(time1, time2) | 计算两个时间之间的时间差 |
9 | TIMESTAMPDIFF(unit, expr1, expr2) | 计算两个日期之间的时间差,以指定的单位返回。 |
10 | TIMESTAMPADD(unit, interval, datetime_expr) | 给日期时间添加指定单位的时间 |
11 | TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2) | 返回两个日期时间表达式的时间差,使用指定的单位 |
在上述方法中,date表示具体的日期时间,interval是一个固定的参数,unit 表示要返回的单独的部分,unit 值可以是下列的值:
unit | 说明 | unit | 说明 | unit | 说明 |
---|---|---|---|---|---|
year | 年 | month | 月 | day | 日 |
hour | 小时 | minute | 分钟 | second | 秒 |
week | 周数,全年第几周 |
SELECT DATE_ADD('2022-11-09', INTERVAL 10 DAY);
SELECT DATE_SUB('2022-11-09', INTERVAL 10 DAY);
SELECT DATEDIFF('2022-11-09', '2023-06-17');
SELECT TIMESTAMPDIFF(MONTH, '2022-01-01', '2023-12-31');
日期时间部分提取
序号 | 函数 | 简要说明 |
---|---|---|
1 | YEAR(date) | 用于获取日期所在的年份,其返回值为一个整数,表示年份。在实际应用中,常用于按年份对数据进行分组或筛选。 |
2 | MONTH(date) | 用于获取日期对应的月份,其返回值为一个整数,表示月份(1-12)。在实际应用中,在按月份对数据进行分组或筛选时非常有用。 |
3 | DAY(date) | 用于从日期或日期时间值中提取天数部分,其返回值为一个整数,表示月份中的天数,取值范围1-31。 |
4 | HOUR(time) | 用于从时间或日期时间值中提取小时部分,其返回值为一个整数,表示小时,取值范围0-23。 |
5 | MINUTE(time) | 用于从时间或日期时间值中提取分钟部分,其返回值为一个整数,表示分钟,取值范围0-59。 |
6 | SECOND(time) | 用于从时间或日期时间值中提取秒部分,其返回值为一个整数,表示秒,取值范围0-59。 |
7 | DATE(date) | 用于提取日期或日期时间的日期部分 |
8 | MONTHNAME(date) | 用于获取日期所在月份的英文名称。 |
9 | DAYNAME(date) | 用于获取给定日期对应星期的英文名称。 |
10 | WEEKDAY(date) | 用于获取日期对应的一周中的索引值。0表示星期一,1表示星期二,以此类推。 |
11 | QUARTER(date) | 用于获取日期对应的季度,范围为1~4。 |
12 | WEEK(date) | 用于获取给定日期所在年的第几周。 |
13 | WEEKOFYEAR(date) | 用于获取给定日期所在年份的第几周。 |
14 | DAYOFYEAR(date) | 用于获取日期是一年中的第几天 |
15 | DAYOFMONTH(date) | 用于获取日期位于所在月份的第几天 |
16 | DAYOFWEEK(date) | 用于获取日期对应的一周中的索引值。1表示星期日,2表示星期一,以此类推。 |
17 | YEARWEEK(date) | 用于获取日期所在的年份和周数。 |
18 | LAST_DAY(date) | 用于获取日期所在月份的最后一天的日期。 |
SELECT YEAR('2022-11-09 12:34:56');
SELECT MONTH('2022-11-09 12:34:56');
SELECT DAY('2022-11-09 12:34:56');
SELECT HOUR('2022-11-09 12:34:56');
SELECT MINUTE('2022-11-09 12:34:56');
SELECT SECOND('2022-11-09 12:34:56');
时间戳转换
序号 | 函数 | 简要说明 |
---|---|---|
1 | FROM_UNIXTIME(unix_timestamp[, format]) | 将UNIX时间戳转换为可读的日期格式。 |
2 | UNIX_TIMESTAMP(date) | 将日期转换为UNIX时间戳。 |
SELECT FROM_UNIXTIME(1672444800);
SELECT UNIX_TIMESTAMP(NOW());
其他有用的函数
函数 | 简要说明 |
---|---|
MAKEDATE(year,n) | 针对给定年份与所在年份中的天数返回一个日期。 |
MAKETIME(hour,minute,second) | 将给定的小时、分钟和秒组合成时间并返回。 |
SELECT MAKEDATE(2025,1);
附录
获取本月第一天
SELECT DATE_ADD(CURDATE(), INTERVAL -DAY(CURDATE()) + 1 DAY);
SELECT CONCAT(DATE_FORMAT(CURDATE(), '%Y-%m'), '-01');
查询今日、昨日、周、上月、本月数据
-- 今天
SELECT * FROM 表名 WHERE to_days(时间字段名) = to_days(now());-- 昨天
SELECT * FROM 表名 WHERE TO_DAYS(NOW()) - TO_DAYS(时间字段名) <= 1 AND TO_DAYS(NOW()) - TO_DAYS(时间字段名) > 0;-- 近7天
SELECT * FROM 表名 WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名);-- 查询当前这周的数据(注意:获取周是从周日至周六计算的,与我们国内周一至周日的习惯不同)
SELECT * FROM 表名 WHERE YEARWEEK(date_format(时间字段名, '%Y-%m-%d')) = YEARWEEK(now());-- 查询上周的数据(同上)
SELECT * FROM 表名 WHERE YEARWEEK(date_format(时间字段名, '%Y-%m-%d')) = YEARWEEK(now()) - 1;-- 近30天
SELECT * FROM 表名 WHERE DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名);查询当前月份的数据
-- SELECT * FROM 表名 WHERE DATE_FORMAT(时间字段名, '%Y-%m') = DATE_FORMAT(now(),'%Y-%m');
-- SELECT * FROM 表名 WHERE DATE_FORMAT(时间字段名, '%Y%m') = DATE_FORMAT(CURDATE(), '%Y%m' );-- 上一月数据
SELECT * FROM 表名 WHERE PERIOD_DIFF(date_format(now( ), '%Y%m') , date_format(时间字段名, '%Y%m')) = 1;-- 查询本季度数据
SELECT * FROM 表名 WHERE QUARTER(时间字段名) = QUARTER(now());-- 查询上季度数据
SELECT * FROM 表名 WHERE QUARTER(时间字段名)=QUARTER(DATE_SUB(now(),interval 1 QUARTER));-- 查询本年数据
SELECT * FROM 表名 WHERE YEAR(时间字段名)=YEAR(NOW());-- 查询上年数据
SELECT * FROM 表名 WHERE year(时间字段名)=year(date_sub(now(),interval 1 year));-- 查询距离当前现在6个月的数据
SELECT * FROM 表名 WHERE 时间字段名 between date_sub(now(), interval 6 month) and now();