mysql时间操作函数学习笔记

阅读mysql8.0的官方手册学习了一下时间操作函数,做一下笔记
点我查看mysql函数列表

获取给定时间的月的最后一天

select LAST_DAY("2019-10-20 12:23:23");

2019-10-31
返回的是datatime

创建一个时分秒的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类型
    读者可以自行对照上述情况,或者自己运行一下
    NOTE
  • 参数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'

获取当前sql执行的时间now()

这个函数的返回值是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 |
+---------------------+----------+---------------------+

获取当前日期是一年中的第几周WEEKOFYEAR()

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            |
+-------------+--------------+------------+-------------+---------------+---------------+

你可能感兴趣的:(mysql,mysql)