相关的文档10bet官方网站 本手册下载 本手册节选

3.3.4.5日期计算

MySQL提供了几个函数,您可以使用它们对日期执行计算,例如,计算年龄或提取日期的部分。

要确定每只宠物的年龄,请使用TIMESTAMPDIFF ()函数。它的参数是您希望在其中表示结果的单位,以及要取其差值的两个日期。下面的查询显示了每个宠物的出生日期、当前日期和年龄(以年为单位)。一个别名年龄),使最终的输出列标签更有意义。

SELECT name, birth,CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet;+----------+------------+------------+------+ | 名字|生产| CURDATE() |年龄  | +----------+------------+------------+------+ | 蓬松| 1993-02-04 | 1993-02-04 | 10 | |爪子| 1994-03-17 | 1994-03-17 | 9 | |巴菲| 1989-05-13 | 1989-05-13 | 14 | |方| 1990-08-27 | 1990-08-27 | 12 | |包泽| 1989-08-31 | 1989-08-31 | 13 | |欢快| 1998-09-11 | 1998-09-11 | 4 | |惠斯勒| 1997-12-09 | 1997-12-09 | 5 | |苗条| 1996-04-29 | 1996-04-29 | 7 | |马勃| 1999-03-30 | 1999-03-30 | 4 |+----------+------------+------------+------+

查询可以工作,但是如果行按一定顺序显示,则可以更容易地扫描结果。这可以通过添加订单的名字子句按名称对输出进行排序:

mysql> SELECT name, birth,CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet+----------+------------+------------+------+ | 名字|生产| CURDATE() |年龄  | +----------+------------+------------+------+ | 包泽| 1989-08-31 | 1989-08-31 | 13 | |巴菲| 1989-05-13 | 1989-05-13 | 14 | |欢快| 1998-09-11 | 1998-09-11 | 4 | |爪子| 1994-03-17 | 1994-03-17 | 9 | |方| 1990-08-27 | 1990-08-27 | 12 | |的| 1993-02-04 | 1993-02-04 | 10 | |马勃| 1999-03-30 | 1999-03-30 | 4 | |苗条| 1996-04-29 | 1996-04-29 | 7 | |惠斯勒| 1997-12-09 | 1997-12-09 | 5 |+----------+------------+------------+------+

对输出进行排序年龄而不是的名字,只是使用不同的命令条款:

SELECT name, birth,CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet+----------+------------+------------+------+ | 名字|生产| CURDATE() |年龄  | +----------+------------+------------+------+ | 活泼的| 1998-09-11 | 1998-09-11 | 4 | |马勃| 1999-03-30 | 1999-03-30 | 4 | |惠斯勒| 1997-12-09 | 1997-12-09 | 5 | |苗条| 1996-04-29 | 1996-04-29 | 7 | |爪子| 1994-03-17 | 1994-03-17 | 9 | |的| 1993-02-04 | 1993-02-04 | 10 | |方| 1990-08-27 | 1990-08-27 | 12 | |包泽| 1989-08-31 | 1989-08-31 | 13 | |巴菲| 1989-05-13 | 1989-05-13 | 14 |+----------+------------+------------+------+

类似的查询也可用于确定已死亡动物的死亡年龄。你可以通过检查这些动物是否死亡值是.然后,对于那些非值,计算之间的差值死亡而且出生价值观:

查询宠物的名字,出生,死亡,时间戳diff(年份,出生,死亡)作为年龄,如果死亡不是空顺序的年龄;+--------+------------+------------+------+ | 名字|生|死|年龄  | +--------+------------+------------+------+ | 加油车| 1989-08-31 | 1989-08-31 | 5  | +--------+------------+------------+------+

查询使用死亡不是空的而不是死亡的< >零因为是不能使用常用比较运算符进行比较的特殊值。这将在后面讨论。看到第3.3.4.6节,“处理空值”

如果你想知道哪些动物下个月过生日呢?对于这种类型的计算,年和日是无关的;只需要提取月份的部分出生列。MySQL提供了几个提取日期部分的函数,例如年()月(),DAYOFMONTH ()月()是合适的函数。要了解它是如何工作的,运行一个显示两者值的简单查询出生而且月(出生)

mysql> SELECT name, birth, MONTH(出生)FROM pet;+----------+------------+--------------+ | 名字| |月出生(诞生 ) | +----------+------------+--------------+ | 蓬松| 1993-02-04 | 2 | |爪子| 1994-03-17 | 3 | |巴菲| 1989-05-13 | 5 | |方8 | | 1990-08-27 | |包泽8 | | 1989-08-31 | |活泼的9 | | 1998-09-11 | |惠斯勒12 | | 1997-12-09 | |苗条| 1996-04-29 | 4 | |马勃| 1999-03-30 | 3  | +----------+------------+--------------+

寻找下个月生日的动物也很简单。假设当前月份是四月。那么月值为4你可以找在五月出生的动物5)是这样的:

mysql> SELECT name FROM WHERE MONTH(birth) = 5;+-------+------------+ | 名字|出生  | +-------+------------+ | 巴菲| 1989-05-13  | +-------+------------+

如果当前月份是12月,就会有一个小问题。不能只在月号(12),寻找按月份出生的动物13因为根本就没有这个月。相反,你要寻找出生在一月份的动物1).

您可以编写查询,使其无论当前月份是多少都可以工作,这样您就不必对特定月份使用数字。DATE_ADD ()使您能够向给定的日期添加时间间隔。的值加上一个月CURDATE (),然后提取月的部分用月(),结果会生成要查找生日的月份:

WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));

完成相同任务的另一种方法是添加1用模函数()得到当前月份之后的下一个月国防部)将月值包装到0如果是当前的12

WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;

月()返回介于1而且12.和国防部(12)返回介于0而且11.所以加法必须在后面国防部(),否则我们将从十一月(11)至一月(1).

如果计算使用了无效的日期,则计算失败并产生警告:

mysql> SELECT '2018-10-31' + INTERVAL 1 DAY;+-------------------------------+ | ' 2018-10-31 ' +间隔1天  | +-------------------------------+ | 2018-11-01  | +-------------------------------+ mysql >选择“2018-10-32”+间隔1天;+-------------------------------+ | ' 2018-10-32 ' +间隔1天  | +-------------------------------+ | 零  | +-------------------------------+ mysql >显示警告;+---------+------+----------------------------------------+ | 水平| |消息代码  | +---------+------+----------------------------------------+ | 警告| 1292 |错误的datetime值:2018-10-32 ' | +---------+------+----------------------------------------+