【问题标题】:MySQL - BETWEEN will not select correct resultsMySQL - BETWEEN 不会选择正确的结果
【发布时间】:2011-08-30 17:47:38
【问题描述】:

我正在尝试选择两个日期之间的行。首先,这是我的数据:

punch_id    eid     time    unixtime    punch_type  day     date        doy
135          2      12:53   1314723193  0            4   08/28/2011     241  
134          2      12:53   1314723190  3            4   08/31/2011     241
133          2      12:53   1314723187  2            4   08/20/2011     241
132          2      12:52   1314723125  1            4   08/30/2011     241

这两个查询我都试过了。

SELECT * FROM `punches` WHERE `date` >= '08/20/11' AND `date` <= '08/31/11'

SELECT * FROM `punches` WHERE `date` BETWEEN '08/20/11' AND '08/31/11'

这些都不选择包含日期 08/31/11 的行。它虽然选择了 08/20/11 的。我尝试以另一种方式使用它,当我运行查询时:

SELECT * FROM `punches` WHERE `date` >= '08/10/11' AND `date` <= '08/20/11'

我再次没有得到正确的结果:20 号再次被排除在外。我执行此操作的方式有什么问题?

【问题讨论】:

标签: mysql select date between


【解决方案1】:

请参阅this related 问题。

正如其他人所提到的,您的主要问题是没有考虑时间。处理该问题的几个选项:

  1. 使用函数将 DateTime 转换为 Date。我不推荐这个选项,因为它可能会使函数non-sargeable

  2. 扩展您的BETWEEN 以明确包含当天的最后时刻:(注意:这是 MS SQL 可以存储的最新可能值,不知道 MySQL 是否具有相同的值)

    SELECT * FROM `punches` WHERE `date` 
    BETWEEN '08/20/11 00:00:00.000' AND '08/31/11 23:59:59.997'
    
  3. 使用&lt; 作为上限值

    SELECT * FROM `punches` WHERE `date` >= '08/20/11' AND `date` < '09/01/11'
    

实际上,在大多数情况下,我认为最后一个更容易。

我想您可以做其他事情,例如更改列的数据类型,但我在这里假设您只是对更改查询感兴趣。

** 免责声明:我是 MS SQL 专家,而不是 MySQL

【讨论】:

  • 这行得通,但几乎是一个“黑客”,并且需要大量工作才能使应用程序为所有查询增加一天。我宁愿修复它并通过更改日期格式或其他方式使其正常工作。
  • @Devin,如果需要你可以做类似where 'date' between "2011-08-20" and date_add( "2011-08-31" , interval 1 day)
【解决方案2】:

我不知道 mysql,但在其他 RDBMS 中,日期假定时间部分为上午 12 点。如果要包括高日期,请在当天加 1。

【讨论】:

    【解决方案3】:

    您的date 字段是DATE 还是DATETIME

    这可能与一天中的时间有关。如果您将DATETIME 存储为

    2011-08-31 13:00:00
    

    那么它将不匹配

    BETWEEN '08/20/11' AND '08/31/11'
    

    你必须使用

    BETWEEN '08/20/11' AND '09/01/11'
    

    MySQL docs for between 说它匹配“小于或等于”最大值,所以这可能是一天中让你失望的时候。

    【讨论】:

      【解决方案4】:

      如果您没有指定日期时间,则暗示 00:00:00。因此,数据库正在做的真正查询更像是......

      SELECT * FROM `punches` WHERE `date` BETWEEN '08/20/11 00:00:00' AND '08/31/11 00:00:00'
      

      因此,2011 年 8 月 31 日 12:53 的一拳将不包括在内。我认为这应该可行,并且比在结束日期添加一天更优雅...

      SELECT * FROM `punches` WHERE DATE(`date`) BETWEEN '2011-08-20' AND '2011-08-31'
      

      【讨论】:

      • 我认为您的意思是在更正后的查询中包含时间 (23:59:59)?
      • 注意 DATE() 函数 - 这会将 DATETIME 转换为 DATE,时间组件有效地设置为 00:00:00。
      • 那个查询实际上返回了零个结果。
      • 不确定 MySQL,但在 MS SQL 中,WHERE 子句中的那个函数意味着它不能使用任何索引。
      • 我不知道为什么原来的查询有些工作——我们不应该使用 YYYY-MM-DD 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2015-08-23
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多