阅读mysql8.0的官方手册学习了一下时间操作函数,做一下笔记
点我查看mysql函数列表
select LAST_DAY("2019-10-20 12:23:23");
2019-10-31
返回的是datatime
SELECT MAKETIME(12,15,30);
12:15:30
返回的是datatime
DATE_ADD(date,INTERVAL expr unit)
——增加,不过expr
是负数就是减少时间
DATE_SUB(date,INTERVAL expr unit)
——减少,不过expr
是负数就是增加时间
所以这两个函数记住一个函数就行了
例子
select DATE_ADD('2020-12-31 23:59:59',INTERVAL -13 HOUR);
2020-12-31 10:59:59 返回是个字符串
select DATE_ADD(MAKETIME(12,23,0),INTERVAL 1 HOUR);
13:23:00 返回是个datatime
select DATE_ADD(MAKETIME(12,23,0),INTERVAL -1 HOUR);
11:23:00返回是个datetime 和上面都是调用DATE_ADD,但是由于这个是-1,所以减少了时间
上面我们看到有时DATE_ADD返回是个string,有时返回是个datetime,其实还有的时候会是date,这是为什么呢?原来这是由于你入参date和你操作的unit来决定的。下面我们说一下DATE_ADD函数的返回情况
date
参数是Date
类型,并且你操作的单位仅是YEAR
,MONTH
,DAY
(没有时间相关的部分),这种情况下你的返回是DATE
类型的date
参数是DATETIME
类型,或者你的第一个单数是DATE
类型,但是你操作的时间单位包括HOURS
,MINUTES
, 或者SECONDS
,那么你的返回值是DATETIME
类型String
类型expr
被认为是字符串类型,并不是我们以为的数值类型unit
并不是只能一个单位,也可以是向下面一样的组合的单位mysql> SELECT DATE_ADD('2018-05-01',INTERVAL 1 DAY);
-> '2018-05-02'
mysql> SELECT DATE_SUB('2018-05-01',INTERVAL 1 YEAR);
-> '2017-05-01'
mysql> SELECT DATE_ADD('2020-12-31 23:59:59',
-> INTERVAL 1 SECOND);
-> '2021-01-01 00:00:00'
mysql> SELECT DATE_ADD('2018-12-31 23:59:59',
-> INTERVAL 1 DAY);
-> '2019-01-01 23:59:59'
mysql> SELECT DATE_ADD('2100-12-31 23:59:59',
-> INTERVAL '1:1' MINUTE_SECOND);//expr是个字符串,组合的单位
-> '2101-01-01 00:01:00'
mysql> SELECT DATE_SUB('2025-01-01 00:00:00',
-> INTERVAL '1 1:1:1' DAY_SECOND);//expr是个字符串,组合的单位
-> '2024-12-30 22:58:59'
mysql> SELECT DATE_ADD('1900-01-01 00:00:00',
-> INTERVAL '-1 10' DAY_HOUR);
-> '1899-12-30 14:00:00'
mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
-> '1997-12-02'
mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002',
-> INTERVAL '1.999999' SECOND_MICROSECOND);
-> '1993-01-01 00:00:01.000001'
这个函数的返回值是YYYY-MM-DD hh:mm:ss
或者YYYYMMDDhhmmss
类型,这个函数可以接受一个int入参xargs,值可以是0~6,这样返回值会包含xargs位毫秒
mysql> SELECT NOW(4);
+--------------------------+
| NOW(4) |
+--------------------------+
| 2019-10-12 12:08:39.1024 |//返回值字符串
+--------------------------+
mysql> SELECT NOW(4) + 0,NOW(4) + 100;
+---------------------+---------------------+
| NOW(4) + 0 | NOW(4) + 100 |
+---------------------+---------------------+
| 20191012121149.3988 | 20191012121249.3988 |//返回值是数字
+---------------------+---------------------+
NOTE
这个函数获取的是sql执行的时间,一个sql中无论经过多久,调用多少次,得到的都是相同的时间,这和sysdate()的表现是不同的
mysql> SELECT NOW(), SLEEP(2), NOW();
+---------------------+----------+---------------------+
| NOW() | SLEEP(2) | NOW()(2) |
+---------------------+----------+---------------------+
| 2019-10-12 11:52:04 | 0 | 2019-10-12 11:52:04 |
+---------------------+----------+---------------------+
1 行于数据集 (2.05 秒)
mysql> select SYSDATE(),sleep(2),SYSDATE();
+---------------------+----------+---------------------+
| SYSDATE() | sleep(2) | SYSDATE()(2) |
+---------------------+----------+---------------------+
| 2019-10-12 11:53:24 | 0 | 2019-10-12 11:53:26 |
+---------------------+----------+---------------------+
mysql> select WEEKOFYEAR(now());
+-------------------+
| WEEKOFYEAR(now()) |
+-------------------+
| 41 |
+-------------------+
同样功能的还有DAYOFWEEK()
,DAYOFMONTH(date)
,DAYOFYEAR(date)
,等等,见名知意,感觉用处不大,就不一一介绍了
YEAR
,MONTH
,DAY
,HOUR
,MINUTE
,SECOND
等函数,不一一介绍了,感觉用处也不大
mysql> SELECT YEAR(NOW()),MONTH(NOW()),DAY(NOW()),HOUR(NOW()),MINUTE(NOW()),SECOND(NOW());
+-------------+--------------+------------+-------------+---------------+---------------+
| YEAR(NOW()) | MONTH(NOW()) | DAY(NOW()) | HOUR(NOW()) | MINUTE(NOW()) | SECOND(NOW()) |
+-------------+--------------+------------+-------------+---------------+---------------+
| 2019 | 10 | 12 | 12 | 1 | 29 |
+-------------+--------------+------------+-------------+---------------+---------------+