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
值的,計算death
和birth
值之間的差值: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()
是適當的方法,要查看它是如何工做的,運行一個簡單的查詢,顯示birth
和MONTH(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()
返回1
到12
之間的數字,MOD(something,12)
返回0
到11
之間的數字,所以,添加必須在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' | +---------+------+----------------------------------------+