MySQL™ 參考手冊(日期計算)

日期計算

MySQL提供了幾個可用於在日期上執行計算的函數,例如,計算年齡或提取日期的部分。mysql

要肯定每隻寵物的年齡,請使用TIMESTAMPDIFF()函數,它的參數是你想要表達結果的單位,以及兩個能夠取差的日期。如下查詢顯示了每隻寵物的出生日期、當前日期和年齡,別名(age)用於使最終輸出列標籤更有意義。sql

mysql> SELECT name, birth, CURDATE(),
       TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
       FROM pet;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Fluffy   | 1993-02-04 | 2019-07-09 |   26 |
| Claws    | 1994-03-17 | 2019-07-09 |   25 |
| Buffy    | 1989-05-13 | 2019-07-09 |   30 |
| Fang     | 1990-08-27 | 2019-07-09 |   28 |
| Bowser   | 1989-08-31 | 2019-07-09 |   29 |
| Chirpy   | 1998-09-11 | 2019-07-09 |   20 |
| Whistler | 1997-12-09 | 2019-07-09 |   21 |
| Slim     | 1996-04-29 | 2019-07-09 |   23 |
| Puffball | 1999-03-30 | 2019-07-09 |   20 |
+----------+------------+------------+------+

查詢有效,但若是以某種順序顯示行,則能夠更輕鬆地掃描結果,這能夠經過添加ORDER BY name子句來按名稱對輸出進行排序來完成:segmentfault

mysql> SELECT name, birth, CURDATE(),
       TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
       FROM pet ORDER BY name;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Bowser   | 1989-08-31 | 2019-07-09 |   29 |
| Buffy    | 1989-05-13 | 2019-07-09 |   30 |
| Chirpy   | 1998-09-11 | 2019-07-09 |   20 |
| Claws    | 1994-03-17 | 2019-07-09 |   25 |
| Fang     | 1990-08-27 | 2019-07-09 |   28 |
| Fluffy   | 1993-02-04 | 2019-07-09 |   26 |
| Puffball | 1999-03-30 | 2019-07-09 |   20 |
| Slim     | 1996-04-29 | 2019-07-09 |   23 |
| Whistler | 1997-12-09 | 2019-07-09 |   21 |
+----------+------------+------------+------+

要按age而不是name對輸出進行排序,只需使用不一樣的ORDER BY子句:函數

mysql> SELECT name, birth, CURDATE(),
       TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
       FROM pet ORDER BY age;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Chirpy   | 1998-09-11 | 2019-07-09 |   20 |
| Puffball | 1999-03-30 | 2019-07-09 |   20 |
| Whistler | 1997-12-09 | 2019-07-09 |   21 |
| Slim     | 1996-04-29 | 2019-07-09 |   23 |
| Claws    | 1994-03-17 | 2019-07-09 |   25 |
| Fluffy   | 1993-02-04 | 2019-07-09 |   26 |
| Fang     | 1990-08-27 | 2019-07-09 |   28 |
| Bowser   | 1989-08-31 | 2019-07-09 |   29 |
| Buffy    | 1989-05-13 | 2019-07-09 |   30 |
+----------+------------+------------+------+

相似的查詢可用於肯定死亡動物的死亡年齡,你能夠經過檢查death值是否爲NULL來肯定這些動物,而後,對於那些具備非NULL值的,計算deathbirth值之間的差值:code

mysql> SELECT name, birth, death,
       TIMESTAMPDIFF(YEAR,birth,death) AS age
       FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name   | birth      | death      | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 |    5 |
+--------+------------+------------+------+

查詢使用death IS NOT NULL而不是death <> NULL,由於NULL是一個特殊值,沒法使用一般的比較運算符進行比較。排序

若是你想知道哪些動物下個月過生日怎麼辦?對於這種類型的計算,年和日是可有可無的,你只想提取birth列的月份部分,MySQL提供了幾個用於提取日期部分的函數,例如YEAR()MONTH()DAYOFMONTH()。這裏MONTH()是適當的方法,要查看它是如何工做的,運行一個簡單的查詢,顯示birthMONTH(birth)的值:get

mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name     | birth      | MONTH(birth) |
+----------+------------+--------------+
| Fluffy   | 1993-02-04 |            2 |
| Claws    | 1994-03-17 |            3 |
| Buffy    | 1989-05-13 |            5 |
| Fang     | 1990-08-27 |            8 |
| Bowser   | 1989-08-31 |            8 |
| Chirpy   | 1998-09-11 |            9 |
| Whistler | 1997-12-09 |           12 |
| Slim     | 1996-04-29 |            4 |
| Puffball | 1999-03-30 |            3 |
+----------+------------+--------------+

在接下來的一個月裏尋找有生日的動物也很簡單,假設當前月份是4月,而後月份值爲4,你能夠像這樣查找5月(第5個月)出生的動物:date

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name  | birth      |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+

若是當前月份是12月,則會出現一個小的複雜狀況,你不能僅僅在月份數字(12)中添加1並查找在第13個月出生的動物,由於沒有這樣的月份,相反,你尋找1月(第1個月)出生的動物。方法

你能夠編寫查詢,以便不管當前月份是什麼,它均可以工做,這樣你就沒必要使用特定月份的數字,DATE_ADD()使你能夠將時間間隔添加到給定日期。若是你將一個月添加到CURDATE()的值,而後使用MONTH()提取月份部分,結果將生成查找生日的月份:im

mysql> SELECT name, birth FROM pet
       WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));

完成相同任務的另外一種方法是在使用模數函數(MOD)將月值包裝爲0(若是它當前爲12)後,添加1以獲取當前一個以後的下一個月:

mysql> SELECT name, birth FROM pet
       WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;

MONTH()返回112之間的數字,MOD(something,12)返回011之間的數字,所以,添加必須在MOD()以後,不然咱們將從11月(11)到1月(1)。

若是計算使用無效日期,則計算失敗並生成警告:

mysql> SELECT '2018-10-31' + INTERVAL 1 DAY;
+-------------------------------+
| '2018-10-31' + INTERVAL 1 DAY |
+-------------------------------+
| 2018-11-01                    |
+-------------------------------+
mysql> SELECT '2018-10-32' + INTERVAL 1 DAY;
+-------------------------------+
| '2018-10-32' + INTERVAL 1 DAY |
+-------------------------------+
| NULL                          |
+-------------------------------+
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1292 | Incorrect datetime value: '2018-10-32' |
+---------+------+----------------------------------------+

上一篇:排序行

相關文章
相關標籤/搜索