天天看點

mysql中日期函數之間的聯系與差別日期函數

日期函數

  • 日期函數
    • 目前日期函數
    • 目前時間函數
    • 目前日期和時間函數
    • 時間戳函數
    • 時間戳函數的反函數
    • 标準時間和日期函數
    • 月份函數和擷取月份名稱函數
    • 擷取星期幾的函數
    • 擷取星期數的函數
    • 擷取天數的函數
    • 擷取年、季度、小時、分鐘和秒鐘的函數
    • 從時間中擷取需要的資訊
    • 時間和秒鐘轉換
    • 計算日期和時間的函數

日期函數

目前日期函數

目前日期的函數

curdate()與current_date() 作用一樣

curdate()+0是将時間轉化為數字;

mysql> select curdate() as date1,current_date() as date2,curdate()+0 as date3;
+------------+------------+----------+
| date1      | date2      | date3    |
+------------+------------+----------+
| 2021-08-30 | 2021-08-30 | 20210830 |
+------------+------------+----------+
1 row in set (0.00 sec)
           

目前時間函數

目前時間的函數

mysql> select curtime() as time1,current_time(),curtime()+0 as time2;
+----------+----------------+--------+
| time1    | current_time() | time2  |
+----------+----------------+--------+
| 15:17:14 | 15:17:14       | 151714 |
+----------+----------------+--------+
1 row in set (0.00 sec)

           

目前日期和時間函數

mysql> select current_timestamp() as time1,localtime(),now(),sysdate() as time2;
+---------------------+---------------------+---------------------+---------------------+
| time1               | localtime()         | now()               | time2               |
+---------------------+---------------------+---------------------+---------------------+
| 2021-08-30 15:22:59 | 2021-08-30 15:22:59 | 2021-08-30 15:22:59 | 2021-08-30 15:22:59 |
+---------------------+---------------------+---------------------+---------------------+
           

時間戳函數

既然是時間戳至少需要包含日期,—以傳回‘1970-01-0100:00:00’GMT到現在的秒數

mysql> select unix_timestamp(),unix_timestamp(now()),unix_timestamp(current_time);
+------------------+-----------------------+------------------------------+
| unix_timestamp() | unix_timestamp(now()) | unix_timestamp(current_time) |
+------------------+-----------------------+------------------------------+
|       1630308333 |            1630308333 |                   1630308333 |
+------------------+-----------------------+------------------------------+
1 row in set (0.00 sec)
           

UNIX_TIMESTAMP(date)若無參數調用,則傳回一個UNIX時間戳(‘1970-01-01

00:00:00’GMT之後的秒數)作為無符号整數。其中,GMT(Green wich mean

time)為格林尼治标準時間。若用date來調用UNIX_TIMESTAMP(),它會将參數值以‘1970-01-01 00:00:00’GMT後的秒數的形式傳回。date可以是一個DATE字元串、DATETIME字元串、TIMESTAMP或一個當地時間的YYMMDD或YYYYMMDD格式的數字。

時間戳函數的反函數

既然時間可以轉換為時間戳,也可以反過來—from_unixtime(數字);

mysql> select from_unixtime(1630308333);
+---------------------------+
| from_unixtime(1630308333) |
+---------------------------+
| 2021-08-30 15:25:33       |
+---------------------------+
1 row in set (0.00 sec)

           

标準時間和日期函數

UTC_TIME()----目前時區的時間

UTC_DATE()--------------傳回目前時區日期的時間

mysql> select UTC_TIME(),UTC_DATE(),UTC_TIME()+0,UTC_DATE()+0;
+------------+------------+--------------+--------------+
| UTC_TIME() | UTC_DATE() | UTC_TIME()+0 | UTC_DATE()+0 |
+------------+------------+--------------+--------------+
| 07:33:02   | 2021-08-30 |        73302 |     20210830 |
+------------+------------+--------------+--------------+
1 row in set (0.00 sec)
           

月份函數和擷取月份名稱函數

mysql> select month(1000),monthname(1000);
+-------------+-----------------+
| month(1000) | monthname(1000) |
+-------------+-----------------+
|          10 | October         |
+-------------+-----------------+
1 row in set (0.00 sec)

mysql> select month(now()),monthname(now());
+--------------+------------------+
| month(now()) | monthname(now()) |
+--------------+------------------+
|            8 | August           |
+--------------+------------------+
1 row in set (0.00 sec)


mysql> select month(20190304),monthname('2019,05,01');
+-----------------+-------------------------+
| month(20190304) | monthname('2019,05,01') |
+-----------------+-------------------------+
|               3 | May                     |
+-----------------+-------------------------+
1 row in set (0.00 sec)

           

擷取星期幾的函數

DAYNAME(d)----傳回目前日期為周幾的名稱

DAYOFWEEK(d)-----傳回目前為一周的第幾天,(周日算第一天)

WEEKDAY(d)------傳回目前為一周第幾天,周一為第一天;

mysql> select dayname(20210809)as t1,dayofweek(20210809),weekday(20211019);
+--------+---------------------+-------------------+
| t1     | dayofweek(20210809) | weekday(20211019) |
+--------+---------------------+-------------------+
| Monday |                   2 |                 1 |
+--------+---------------------+-------------------+
1 row in set (0.00 sec)
           

擷取星期數的函數

week(20210809),表示傳回目前日期為一年中的第幾周,預設星期日為一周第一天;

week(20210809,1),表示傳回目前日期為一年中的第幾周,指定周一為一周開始;

weekofyear(20210809),傳回目前日期為一年中的第幾周;

mysql> select week(20210809),week(20210809,1),weekofyear(20210809),weekofyear(20210809);
+----------------+------------------+----------------------+----------------------+
| week(20210809) | week(20210809,1) | weekofyear(20210809) | weekofyear(20210809) |
+----------------+------------------+----------------------+----------------------+
|             32 |               32 |                   32 |                   32 |
+----------------+------------------+----------------------+----------------------+
1 row in set (0.00 sec)

           

擷取天數的函數

天數主要是是為了獲得一年中的第幾天,一個月中的第幾天,一周的第幾天

mysql> select dayofyear(20210909),dayofmonth(20210909),dayofweek(20100909);
+---------------------+----------------------+---------------------+
| dayofyear(20210909) | dayofmonth(20210909) | dayofweek(20100909) |
+---------------------+----------------------+---------------------+
|                 252 |                    9 |                   5 |
+---------------------+----------------------+---------------------+
           

擷取年、季度、小時、分鐘和秒鐘的函數

之前提到了擷取月份,日期,還可以單獨擷取其他時間的函數

mysql> select year(20220909),quarter(20210909),hour(now()),minute(20210909122334),second(now());
+----------------+-------------------+-------------+------------------------+---------------+
| year(20220909) | quarter(20210909) | hour(now()) | minute(20210909122334) | second(now()) |
+----------------+-------------------+-------------+------------------------+---------------+
|           2022 |                 3 |          15 |                     23 |             7 |
+----------------+-------------------+-------------+------------------------+---------------+
1 row in set (0.00 sec)
           

也非常的見名知意;

從時間中擷取需要的資訊

mysql> SELECT EXTRACT(YEAR FROM '2018-07-02' ) AS coll,
    -> EXTRACT(YEAR_MONTH FROM '2018-07-12 01:02:03') AS col2,
    ->  EXTRACT(DAY_MINUTE FROM '2018-07-12 01:02:03') AS col3;
+------+--------+--------+
| coll | col2   | col3   |
+------+--------+--------+
| 2018 | 201807 | 120102 |
+------+--------+--------+
1 row in set (0.00 sec)

mysql> SELECT EXTRACT(YEAR FROM now() ) AS coll,
    -> EXTRACT(YEAR_MONTH FROM now()) AS col2,
    ->  EXTRACT(DAY_MINUTE FROM now()) AS col3;
+------+--------+------+
| coll | col2   | col3 |
+------+--------+------+
| 2021 | 202108 | 1642 |
+------+--------+------+
1 row in set (0.00 sec)
           

時間和秒鐘轉換

TIME_TO_SEC(time)傳回已轉化為秒的time參數,

轉換公式為:小時3600+分鐘60+秒。

mysql> select time_to_sec(now());
+--------------------+
| time_to_sec(now()) |
+--------------------+
|              61403 |
+--------------------+
1 row in set (0.00 sec)

mysql> select sec_to_time(61403);
+--------------------+
| sec_to_time(61403) |
+--------------------+
| 17:03:23           |
+--------------------+
1 row in set (0.00 sec)


           

計算日期和時間的函數

計算日期和時間的函數有DATE_ADD()、ADDDATE()、DATE_SUB()、SUBDATE()、ADDTIME()、SUBTIME()和DATE_DIFF()。
mysql中日期函數之間的聯系與差別日期函數

date_add(時間,interval 要增加的值 增加的時間類型)

adddate(時間,interval 要增加的值 增加的時間類型)

mysql> select date_add(now(),interval 1 year)as  time1,adddate(current_date(),interval 2 month) as time2;
+---------------------+------------+
| time1               | time2      |
+---------------------+------------+
| 2022-08-30 17:10:11 | 2021-10-30 |
+---------------------+------------+
1 row in set (0.00 sec)
           

有加就有減------

date_sub(時間,interval 要減少的值 減少的時間類型)

subdate(時間,interval 要減少的值 增加的時間類型)

mysql> select date_sub(curdate() ,interval 1 month)as col1,subdate(now() ,interval 1 month) as col2;
+------------+---------------------+
| col1       | col2                |
+------------+---------------------+
| 2021-07-30 | 2021-07-30 17:14:55 |
+------------+---------------------+
1 row in set (0.00 sec)

mysql> select date_sub(curdate() ,interval 1 month)as col1,subdate(now() ,interval 1 hour) as col2;
+------------+---------------------+
| col1       | col2                |
+------------+---------------------+
| 2021-07-30 | 2021-08-30 16:15:08 |
+------------+---------------------+
1 row in set (0.00 sec)
           

加一個負值等于減,減一個負值等于加----基本操作

date類型的操作可以操作到年\月\日\時間

時間加減操作-----

mysql> select time_add(now(),'12:12:12') as col,addtime(now(),'00:00:00')as col2;
ERROR 1305 (42000): FUNCTION test.time_add does not exist
mysql> select addtime(now(),'00:00:00')as col2;
+---------------------+
| col2                |
+---------------------+
| 2021-08-30 17:22:14 |
+---------------------+
1 row in set (0.00 sec)

mysql> select sub_time(now(),'00:38:00') as co1;
ERROR 1305 (42000): FUNCTION test.sub_time does not exist
mysql> select subtime(now(),'00:38:00') as co1;
+---------------------+
| co1                 |
+---------------------+
| 2021-08-30 16:45:11 |
+---------------------+
1 row in set (0.00 sec)
           

本來以為按照date的邏輯能有time_add,竟然沒有…好尴尬!!!

傳回兩天之間的間隔天數

datediff(date1,date2)傳回 date1-date2的間隔天數;

mysql> select datediff('2019-09-09 12:12:12',now())as cltw;
+------+
| cltw |
+------+
| -721 |
+------+
1 row in set (0.00 sec)
           

日期和時間格式化

DATE_FORMAT(date,format)根據format指定的格式顯示date值。

mysql中日期函數之間的聯系與差別日期函數

這個玩意跟java日期轉換方法類似-----,標明日期,指定格式

mysql>  SELECT DATE_FORMAT(now(), '%W %M %Y') AS coll,
    -> date_format(now() ,'%D %y %a %d %m %b %j') as coll2;
+--------------------+---------------------------+
| coll               | coll2                     |
+--------------------+---------------------------+
| Monday August 2021 | 30th 21 Mon 30 08 Aug 242 |
+--------------------+---------------------------+
1 row in set (0.00 sec)


mysql> SELECT DATE_FORMAT(now(), '%H:%i:%s') AS col3,
    -> DATE_FORMAT(now(), '%X %V') AS col4;
+----------+---------+
| col3     | col4    |
+----------+---------+
| 17:37:13 | 2021 35 |
+----------+---------+
1 row in set (0.00 sec)

mysql>

           

除了日期轉換還有時間轉換函數

mysql> select time_format('17:23:45','%H %K %H %I %L');
+------------------------------------------+
| time_format('17:23:45','%H %K %H %I %L') |
+------------------------------------------+
| 17 K 17 05 L                             |
+------------------------------------------+
1 row in set (0.00 sec)

mysql> select time_format('17:23:45','%H %k %h %I %l');
+------------------------------------------+
| time_format('17:23:45','%H %k %h %I %l') |
+------------------------------------------+
| 17 17 05 05 5                            |
+------------------------------------------+
1 row in set (0.00 sec)
           

擷取時間對應的顯示格式----

GET_FORMAT(val_type,

format_type)傳回日期時間字元串的顯示格式,val_type表示日期資料類型,包括DATE、DATETIME和TIME;format_type表示格式化顯示類型,包括EUR、INTERVAL、ISO、JIS、USA。

mysql中日期函數之間的聯系與差別日期函數

本筆記的目的是為了友善程式員們檢視基礎知識,同時也是為了回顧一下之前學過的内容----深入;