MySQL提供了幾個函數,可以用來計算日期,常用的例子就是,計算年齡或提取日期部分。
1. 計算年齡:
mysql中要想計算一個人的年齡,相當于目前日期的年和出生日期之間的差。如果目前日期的月曆年比出生日期早,則減去一年。
通過以下查詢來顯示出生日期、目前日期和年齡數值的年數字。
SELECT name, birth, CURDATE(),
(YEAR(CURDATE())-YEAR(birth))
- (RIGHT(CURDATE(),5)<RIGHT(birth,5))
AS age
FROM pet;
結果:
+----------+------------+------------+------+| name | birth | CURDATE() | age |+----------+------------+------------+------+| Fluffys | 1993-02-04 | 2009-10-28 | 10 || Claws | 1994-03-17 | 2009-10-28 | 9 || Buffy | 1989-05-13 | 2009-10-28 | 14 || Fang | 1990-08-27 | 2009-10-28 | 12 || Bowser | 1989-08-31 | 2009-10-28 | 13 || Chirpy | 1998-09-11 | 2009-10-28 | 4 || Whistler | 1997-12-09 | 2009-10-28 | 5 || Slim | 1996-04-29 | 2009-10-28 | 7 || Puffball | 1999-03-30 | 2009-10-28 | 4 |+----------+------------+------------+------+
函數解釋:
此處,YEAR()提取日期的年部分,RIGHT()提取日期的MM-DD (月曆年)部分的最右面5個字元。比較MM-DD值的表達式的結果值一般為1或0,如果CURDATE()的年比birth的年早,則年份應減去1。(這個比較表達式需要了解一下)。
(1). 盡管查詢可行,如果以某個順序排列行,則能更容易地浏覽結果。添加ORDER BY name子句按照名字對輸出進行排序則能夠實作.
SELECT name, birth, CURDATE(),
(YEAR(CURDATE())-YEAR(birth)) - (RIGHT(CURDATE(),5)<RIGHT(birth,5))AS ageFROM pet ORDER BY name;+----------+------------+------------+------+| name | birth | CURDATE() | age |+----------+------------+------------+------+| Bowser | 1989-08-31 | 2003-08-19 | 13 || Buffy | 1989-05-13 | 2003-08-19 | 14 || Chirpy | 1998-09-11 | 2003-08-19 | 4 || Claws | 1994-03-17 | 2003-08-19 | 9 || Fang | 1990-08-27 | 2003-08-19 | 12 || Fluffy | 1993-02-04 | 2003-08-19 | 10 || Puffball | 1999-03-30 | 2003-08-19 | 4 || Slim | 1996-04-29 | 2003-08-19 | 7 || Whistler | 1997-12-09 | 2003-08-19 | 5 |+----------+------------+------------+------+
(2). 為了按age而非name排序輸出,隻要再使用一個ORDER BY子句:
SELECT name, birth, CURDATE(),
(YEAR(CURDATE())-YEAR(birth)) - (RIGHT(CURDATE(),5)<RIGHT(birth,5))AS ageFROM pet ORDER BY age;+----------+------------+------------+------+| name | birth | CURDATE() | age |+----------+------------+------------+------+| Chirpy | 1998-09-11 | 2003-08-19 | 4 || Puffball | 1999-03-30 | 2003-08-19 | 4 || Whistler | 1997-12-09 | 2003-08-19 | 5 || Slim | 1996-04-29 | 2003-08-19 | 7 || Claws | 1994-03-17 | 2003-08-19 | 9 || Fluffy | 1993-02-04 | 2003-08-19 | 10 || Fang | 1990-08-27 | 2003-08-19 | 12 || Bowser | 1989-08-31 | 2003-08-19 | 13 || Buffy | 1989-05-13 | 2003-08-19 | 14 |+----------+------------+------------+------+
(3). 可以使用一個類似的查詢來确定已經死亡動物的死亡年齡。你通過檢查death值是否是NULL來确定是哪些動物,然後,對于那些非NULL值的動物,需要計算出death和birth值之間的差:
SELECT name, birth, death,
(YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))AS ageFROM 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是特殊的值,不能使用普通比較符來比較,以後會給出解釋。參見3.3.4.6節,“NULL值操作”。
(4). 如果你想要知道哪個動物下個月過生日,怎麼辦?對于這類計算,年和天是無關的,你隻需要提取birth列的月份部分。MySQL提供幾個日期部分的提取函數,例如YEAR( )、MONTH( )和DAYOFMONTH( )。在這裡MONTH()是适合的函數。為了看它怎樣工作,運作一個簡單的查詢,顯示birth和MONTH(birth)的值:
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 |+----------+------------+--------------+
ELECT name, birth FROM pet WHERE MONTH(birth) = 5;+-------+------------+| name | birth |+-------+------------+| Buffy | 1989-05-13 |+-------+------------+
SELECT name, birth FROM petWHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));
完成該任務的另一個方法是加1以得出目前月份的下一個月(在使用取模函數(MOD)後,如果月份目前值是12,則“復原”到值0):SELECT name, birth FROM petWHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;
注意,MONTH傳回在1和12之間的一個數字,且MOD(something,12)傳回在0和11之間的一個數字,是以必須在MOD( )以後加1,否則我們将從11月( 11 )跳到1月(1)。