天天看點

MySQL 日期計算

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)。      

繼續閱讀