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

3.3.4.5日期计算

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

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

mysql> 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 ORDER BY name+----------+------------+------------+------+ | 名字|生产| 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 |+----------+------------+------------+------+

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

mysql> SELECT name, birth,CURDATE(), TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age FROM pet ORDER BY age+----------+------------+------------+------+ | 名字|生产| 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 |+----------+------------+------------+------+

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

SELECT name, birth,death, TIMESTAMPDIFF(YEAR,birth,death) AS age FROM pet WHERE death不是NULL ORDER BY age+--------+------------+------------+------+ | 名字|生|死|年龄  | +--------+------------+------------+------+ | 加油车| 1989-08-31 | 1989-08-31 | 5  | +--------+------------+------------+------+

查询使用死亡并非无效而不是死亡<> NULL因为是一个特殊值,不能使用通常的比较操作符进行比较。这将在后面讨论。看到章节3.3.4.6“使用空值”

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

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 pet WHERE MONTH(birth) = 5+-------+------------+ | 名字|出生  | +-------+------------+ | 巴菲| 1989-05-13  | +-------+------------+

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

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

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

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

SELECT name, FROM pet WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;

月()返回之间的数字1而且12。和国防部(12)返回之间的数字0而且11。所以加法必须在后面国防部(),否则我们将从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 ' | +---------+------+----------------------------------------+