按日期查询
在 MySQL 中的日期和时间系列的最后一部分中,我们将通过编写 SELECT 查询来将迄今为止学到的所有知识付诸实践,以获得对数据的与日期相关的细节。
从 Datetime 列中选择日期
数据库从业人员在尝试查询日期时遇到的首要挑战之一是大量时间数据存储为 DateTime 和 Timestamp 数据类型。例如,Sakila 示例数据库将 customer 表的 create_date 列存储为 Datetime:
因此,如果我们尝试选择在特定日期创建的客户记录,就不能只提供日期值:
一个简单的解决方法是使用 DATE() 函数将 Datetime 值转换为日期:
现在,任何匹配日期的记录都将被返回。
获取两个日期之间的差异
执行确定某件事发生多久之前的查询是非常常见的。在 MySQL 中,这样做的方法是使用 DATEDIFF() 函数。它接受两个日期值并返回它们之间的天数。以下是一个使用 Navicat for MySQL 16 的简单示例:
请注意,在上面的示例中,DATEDIFF() 让我们知道第一个日期比第二个日期晚 10 天。第一个参数也可以使用更早的日期,它将返回一个负值:
计算天数以外的时间段
对于天数以外的时间段,我们需要做一些转换。例如,我们可以除以 7 来获得两个日期之间的周数。使用舍入可以在结果中显示整数周:
ROUND(DATEDIFF(end_date, start_date)/7, 0) AS weeksout
对于其他时间段,TIMESTAMPDIFF() 函数可能会有所帮助。它接受两个 TIMESTAMP 或 DATETIME 值(DATE 值将在 MySQL 中自动转换)以及我们想要差异的时间单位。例如,我们可以在第一个参数中指定 MONTH 作为单位:
SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04') -- Outputs: 0 SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05') -- Outputs: 1 SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15') -- Outputs: 1 SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16') -- Outputs: 7
一个更复杂的例子
一旦掌握了 DATEDIFF() 函数的窍门,就可以以更进阶的方式使用它。举个例子,这里有一个查询,它使用 DATEDIFF() 函数来计算客户在归还电影之前租借的平均天数:
为此,将 DATEDIFF() 函数的结果传递给 AVG() 函数,然后四舍五入到小数点后 1 位。
系列总结
我们在这个日期和时间系列中涵盖了很多内容,包括:
- MySQL 的五种时态数据类型
- 一些重要的面向日期或时间的功能
- 如何在 MySQL 中创建日期和时间
- 按日期查询
虽然在 MySQL 中处理时态数据肯定还有很多工作要做,但希望本系列能让你在学习 MySQL 的道路上有个很好的开端。