1

我想查询

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'

有没有更好/简单/优雅的方法来做到这一点?

4

3 回答 3

4

用于DATE()隔离日期时间表达式的日期部分。

WHERE DATE(MyDate) = '2013-07-08'
于 2013-07-11T20:05:47.623 回答
1

如果您尝试比较日期,请使用它。如果不忽略。

这可能不是最完美的方式,但我过去曾使用过。基本上我会格式化两个日期,以便它们可以与大于或等于语句(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')

于 2013-07-11T20:11:22.783 回答
0

在谓词(例如 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

我认为所有那些明确指定午夜时间值的额外零都是不必要的混乱。

于 2013-07-11T20:25:45.143 回答