日期函數
- 日期函數
-
- 目前日期函數
- 目前時間函數
- 目前日期和時間函數
- 時間戳函數
- 時間戳函數的反函數
- 标準時間和日期函數
- 月份函數和擷取月份名稱函數
- 擷取星期幾的函數
- 擷取星期數的函數
- 擷取天數的函數
- 擷取年、季度、小時、分鐘和秒鐘的函數
- 從時間中擷取需要的資訊
- 時間和秒鐘轉換
- 計算日期和時間的函數
日期函數
目前日期函數
目前日期的函數
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()。

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值。
這個玩意跟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中日期函數之間的聯系與差別日期函數
本筆記的目的是為了友善程式員們檢視基礎知識,同時也是為了回顧一下之前學過的内容----深入;