我想查询
MyDate= '2013-07-08'
从以下记录
MyDate
2013-07-08 09:15:21
2013-07-08 09:15:48
2013-07-09 09:20:39
我想出了一些丑陋的东西:
MyDate > '2013-07-07 23:59:59' AND MyDate < '2013-07-09 00:00:01'
有没有更好/简单/优雅的方法来做到这一点?
用于DATE()
隔离日期时间表达式的日期部分。
WHERE DATE(MyDate) = '2013-07-08'
如果您尝试比较日期,请使用它。如果不忽略。
这可能不是最完美的方式,但我过去曾使用过。基本上我会格式化两个日期,以便它们可以与大于或等于语句(YEAR/MONTH/DAY)一起使用。
SELECT * FROM table WHERE MyDate > DATE_FORMAT(2013-07-07 23:59:59, '%Y%m%y') AND MyDate < DATE_FORMAT(2013-07-09 00:00:01, '%Y%m %y')
在谓词(例如 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
我认为所有那些明确指定午夜时间值的额外零都是不必要的混乱。