在谓词(例如 WHERE 子句)中匹配 DATETIME 的日期部分的规范模式是:
WHERE MyDate >= '2013-07-08'
AND MyDate < '2013-07-08' + INTERVAL 1 DAY
当没有提供时间组件时,MySQL 使用午夜作为时间组件,因此无需提供午夜的时间组件。谓词中的裸列引用允许 MySQL 考虑对 MyDate 列上的索引进行有效的范围扫描。
为了完整起见,我们注意到也可以使用 ETWEEN 运算符。但是因为与 BETWEEN 的“高端”比较是“小于或等于”,所以要仅获取具有单日日期分量的值,我们需要备份最小的时间部分,即 DATETIME是一秒:
WHERE MyDate BETWEEN '2013-07-08'
AND '2013-07-08' + INTERVAL 1 DAY + INTERVAL -1 SECOND
(如果我们有一个具有更精细分辨率的数据类型,我们希望从第二天开始退后那个最小的分辨率单位。)
为了避免这个问题,在给定的日期时间/时间戳数据类型上的分辨率有多好(对于其他数据库,例如 SQL Server 而不是 MySQL),我只是偏好前一种模式,使用谓词如:
dateexpr >= midnight and dateexpr < midnight of next day
这是明确的,不可能错过 23:59:59.997 的时间值,也不可能精确到第二天的午夜。
因为默认时间组件,当没有提供时,是午夜,第一个查询谓词相当于:
WHERE MyDate >= '2013-07-08 00:00:00'
AND MyDate < '2013-07-08 00:00:00' + INTERVAL 1 DAY
我认为所有那些显式指定午夜时间值的额外零都是不必要的混乱。