日期计算

xiaoxiao2021-02-28  210

日期计算(转自http://blog.163.com/zswself@126/blog/static/22588036200712522214929/) MySQL提供了几个函数,可以用来计算日期,例如,计算年龄或提取日期部分。 要想确定每个宠物有多大,可以计算当前日期的年和出生日期之间的差。如果当前日期的日历年(MM-DD)比出生日期早(不满周岁),则减去一年。以下查询显示了每个宠物的出生日期、当前日期和年龄。 mysql> SELECT name, birth, CURDATE(),       -> (YEAR(CURDATE())-YEAR(birth))       -> - (RIGHT(CURDATE(),5)       -> AS age       -> FROM pet; +----------+------------+------------+------+ | name        | birth          | CURDATE()  | age  | +----------+------------+------------+------+ | Fluffy    | 1993-02-04 | 2003-08-19 |    10 | | Claws      | 1994-03-17 | 2003-08-19 |      9 | | Buffy      | 1989-05-13 | 2003-08-19 |    14 | | Fang        | 1990-08-27 | 2003-08-19 |    12 | | Bowser    | 1989-08-31 | 2003-08-19 |    13 | | Chirpy    | 1998-09-11 | 2003-08-19 |      4 | | Whistler | 1997-12-09 | 2003-08-19 |      5 | | Slim        | 1996-04-29 | 2003-08-19 |      7 | | Puffball | 1999-03-30 | 2003-08-19 |      4 | +----------+------------+------------+------+ 此 处,YEAR()提取日期的年部分,RIGHT()提取日期的日历年(MM-DD,最右面5个字符)部分。比较MM-DD值的表达式部分的值一般为1或 0,如果CURDATE()的年比birth的年早,则年份应减去1。使用alias(age)来使输出的列标记更有意义。 如果以某个顺序排列行,则能更容易地浏览结果。添加ORDER BY name子句按照名字对输出进行排序则能够实现。 mysql> SELECT name, birth, CURDATE(),       -> (YEAR(CURDATE())-YEAR(birth))       -> - (RIGHT(CURDATE(),5)       -> 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 | +----------+------------+------------+------+ 为了按age而非name排序输出,只要再使用一个ORDER BY子句: mysql> SELECT name, birth, CURDATE(),       -> (YEAR(CURDATE())-YEAR(birth))       -> - (RIGHT(CURDATE(),5)       -> 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 | +----------+------------+------------+------+ 可以使用一个类似的查询来确定已经死亡动物的死亡年龄。你通过检查death值是否是NULL来确定是哪些动物,然后,对于那些非NULL值的动物,需要计算出death和birth值之间的差:

mysql> SELECT name, birth, death,     -> (YEAR(death)-YEAR(birth)) - (RIGHT(death,5)     -> 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是特殊的值,不能使用普通比较符来比较,以后会给出解释。参见3.3.4.6节,“NULL值操作”。 如 果你想要知道哪个动物下个月过生日,怎么办?对于这类计算,年和天是无关的,你只需要提取birth列的月份部分。MySQL提供几个日期部分的提取函 数,例如YEAR()、MONTH()和DAYOFMONTH()。在这里MONTH()是适合的函数。为了看它怎样工作,运行一个简单的查询,显示 birth和MONTH(birth)的值: 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月),方法是: mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5; +-------+------------+ | name  | birth      | +-------+------------+ | Buffy | 1989-05-13 | +-------+------------+ 如果当前月份是12月,就有点复杂了。你不能只把1加到月份数(12)上并寻找在13月出生的动物,因为没有这样的月份。相反,你应寻找在1月出生的动物(1月) 。 你可以编写查询,不管当前月份是什么它都能工作。采用这种方法不必在查询中使用一个特定的月份,DATE_ADD()允许在一个给定的日期上加上时间间隔。如果在NOW()值上加上一个月,然后用MONTH()提取月份,结果产生生日所在月份: mysql> SELECT name, birth FROM pet     -> WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH)); 完成该任务的另一个方法是加1以得出当前月份的下一个月(在使用取模函数(MOD)后,如果月份当前值是12,则“回滚”到值0): mysql> SELECT name, birth FROM pet     -> WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1; 注意,MONTH返回在1和12之间的一个数字,且MOD(something,12)返回在0和11之间的一个数字,因此必须在MOD()以后加1。

转载请注明原文地址: https://www.6miu.com/read-23187.html

最新回复(0)