确定每个宠物多少岁,使用timestampdiff()函数。它的第一个参数是你希望表达结果的单位,以及两个日期。下面的查询显示每个宠物的出生日期、当前日期和年龄。别名(AGE)用于使最终输出列标签更有意义。

    1. mysql> SELECT name, birth, CURDATE(),
    2. -> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
    3. -> FROM pet;
    4. +----------+------------+------------+------+
    5. | name | birth | CURDATE() | age |
    6. +----------+------------+------------+------+
    7. | Fluffy | 1993-02-04 | 2003-08-19 | 10 |
    8. | Claws | 1994-03-17 | 2003-08-19 | 9 |
    9. | Buffy | 1989-05-13 | 2003-08-19 | 14 |
    10. | Fang | 1990-08-27 | 2003-08-19 | 12 |
    11. | Bowser | 1989-08-31 | 2003-08-19 | 13 |
    12. | Chirpy | 1998-09-11 | 2003-08-19 | 4 |
    13. | Whistler | 1997-12-09 | 2003-08-19 | 5 |
    14. | Slim | 1996-04-29 | 2003-08-19 | 7 |
    15. | Puffball | 1999-03-30 | 2003-08-19 | 4 |
    16. +----------+------------+------------+------+

    查询结果正常,但如果按一定顺序显示行,则可以更容易地扫描结果。这可以通过添加一个按名称子句来按名称排序输出来实现:

    mysql> SELECT name, birth, CURDATE(),
        -> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
        -> FROM 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 |
    +----------+------------+------------+------+
    

    按年龄而不是名称排序输出,只需使用不同的按次排序的子句:

    mysql> SELECT name, birth, CURDATE(),
        -> TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
        -> FROM 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 |
    +----------+------------+------------+------+
    

    类似的查询可以用来确定死亡动物的死亡年龄。通过检查死亡值是否为null,可以确定是哪些动物。然后,对于那些死亡的动物,计算死亡值和出生值之间的差值:

    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 |
    +--------+------------+------------+------+
    

    如果你想知道下个月有哪些动物过生日呢?对于这种类型的计算,一年与一天无关,只需提取出生月份的一部分。MySQL提供了提取部分日期的多种功能,如year(),month(),和dayofmonth()。month()函数适合处理该需求。要了解它是如何工作的,请运行一个简单的查询,它显示出生和月份(出生)的值:

    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,你可以找5月出生的动物(5个月)

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

    如果当前月份是十二月,会有一点小麻烦。你不能仅仅在月号(12)中加上一个,并且寻找13月出生的动物,因为没有这样的月份。相反,你要寻找一月出生的动物(1月)。

    您可以编写查询,以便不管当前月份是什么,它都可以工作,这样您就不必在某个月使用这个数字。date_add()允许你添加一个时间间隔,一个给定的日期。如果你加入一个月的curdate()值,然后提取月部分month(),结果产生的就是生日月:

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