【问题标题】:Getting the date from DATETIME. mySQL从 DATETIME 获取日期。 mysql
【发布时间】:2013-07-11 20:04:56
【问题描述】:

我想查询

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'

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

【问题讨论】:

    标签: mysql sql date datetime


    【解决方案1】:

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

    WHERE DATE(MyDate) = '2013-07-08'
    

    【讨论】:

    • 请注意,将列包装在函数中会使 MySQL 无法有效使用 MyDate 列上的索引。
    • @spencer7593 非常感谢。当您只是想“昨天上线”时,那些小花絮就会被掩盖
    【解决方案2】:

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

    这可能不是最完美的方式,但我过去曾使用过。基本上我会格式化两个日期,以便它们可以与大于或等于语句(YEAR/MONTH/DAY)一起使用。

    SELECT * FROM 表 WHERE MyDate > DATE_FORMAT(2013-07-07 23:59:59, '%Y%m%y') AND MyDate

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 在这种情况下 BETWEEN 会不会更好?
      • @edwardmp:BETWEEN 进行 <,因此它也会“匹配”'2013-07-09'。如果我们想使用 BETWEEN,它应该是BETWEEN '2013-07-08' AND '2013-07-08' + INTERVAL 1 DAY + INTERVAL -1 SECOND
      猜你喜欢
      • 2014-09-17
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2010-10-09
      相关资源
      最近更新 更多