【问题标题】:mysql between dates getting the result日期之间的mysql得到结果
【发布时间】:2011-10-06 06:07:49
【问题描述】:

我在 mytable 中有以下行

date_start
-----------
2011-09-20 13:00:00
2011-10-01 13:14:00
2011-10-09 13:16:00
2011-09-27 15:00:00
2011-09-30 14:04:00
2011-10-03 14:00:00


我有这个问题:

SELECT date_start
FROM `mytable`
WHERE date_start >= "2011-09-19"
AND date_start <= "2011-09-30"
LIMIT 0 , 30

这里的问题是它只输出:

2011-09-20 13:00:00
2011-09-27 15:00:00

我期待这个结果:

    2011-09-20 13:00:00
    2011-09-27 15:00:00
    2011-09-30 14:04:00

因为如果我们查看查询,它应该包含以下结果:2011-09-30 14:04:00
我在这里做错了什么?

我也在mysql中使用了BETWEEN,但输出还是一样。

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 您的date_start 列是什么类型的列?如果它是一个字符串类型,你正在做的比较将是一个字符串比较,在这种情况下"2011-09-30 14:04:00" 被认为是“大于”"2011-09-30"

标签: php mysql sql date datetime


【解决方案1】:

假定被视为日期时间的日期具有 00:00:00 hours:minutes:seconds 部分。因此,2011-09-30 14:04:00 实际上 >= 2011-09-30。

要做你想做的事,试试吧:

SELECT date_start
FROM `mytable`
WHERE date(date_start) >= "2011-09-19"
AND date(date_start) <= "2011-09-30"
LIMIT 0 , 30

【讨论】:

  • 这会起作用,但是随着表变得非常大,查询会变得很慢。 MySQL 将无法使用您可能针对 start_date 字段定义的任何索引,因为您正在该字段上执行功能。为了有效地使用索引,该字段必须以其原始状态使用,并与非确定性值(与数据的另一部分无关的东西)进行比较
  • 因此,对要比较的值使用DATE() 函数,然后添加1 天并使用&lt; 而不是&lt;=
【解决方案2】:

时间也被考虑在内。你应该提到这个像

SELECT date_start
FROM `mytable`
WHERE date_start >= "2011-09-19"
AND date_start <= "2011-09-30 23:59:59"
LIMIT 0 , 30

【讨论】:

    【解决方案3】:

    2011-09-30 将被解释为2011-09-30 00:00:00。尝试将范围的结尾设置为2011-09-30 23:59:59,你应该会很好。

    【讨论】:

      【解决方案4】:

      就我个人而言,我会将日期和时间元素拆分为两个单独的字段,date_starttime_start,这将使您的查询能够按照编码正常工作,并且还允许您执行更复杂和有趣的与日期相关的操作诸如在我对以下问题的回答中解释的活动。

      Select all months within given date span, including the ones with 0 values

      但是,如果您无法对系统的工作方式进行太多更改,则在您希望过滤的日期上添加一天,然后进行 &lt; 而不是 &lt;= 比较也可以。

      WHERE date_start >= "2011-09-19"
          AND date_start < "2011-10-01"
      

      这将比在过滤器中执行 DATE(date_start) 更快,因为 MySQL 将无法使用任何索引,因为您正在对可能被索引的字段执行函数。

      希望对您有所帮助。

      【讨论】:

        【解决方案5】:

        date_start &lt;= '2011-09-30' 表示包含日期2011-09-30 00:00:00 但不包含2011-09-30 00:00:01 及以后的日期。您可以使用&lt; 运算符加上常识日期算术来解决问题:

        SELECT date_start
        FROM   mytable
        WHERE  date_start >= '2011-09-19'
        AND    date_start <  '2011-09-30' + INTERVAL 1 DAY
        LIMIT  0, 30
        

        【讨论】:

          【解决方案6】:

          如果您在查询中使用 between 语句,那么它将检索在起点和终点之间的所有记录。

          例如:

          SELECT date_start
          FROM `mytable`
          WHERE date_start between '2011-09-19'and '2011-09-30:23:59:59'
          LIMIT 0 , 30
          

          根据您的要求试试这个。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多