MySQL - BETWEEN不会选择正确的结果

时间:2011-08-30 17:47:38

标签: mysql select date between

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

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次被遗漏了。我执行此操作的方式有什么问题?

4 个答案:

答案 0 :(得分:3)

请参阅this related问题。

正如其他人所说,你的主要问题不在于时间问题。处理这个的几个选项:

  1. 使用函数将DateTime转换为Date。我不建议使用此选项,因为它可能会生成函数non-sargeable

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

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

    SELECT * FROM `punches` WHERE `date` >= '08/20/11' AND `date` < '09/01/11'
    
  4. 在大多数情况下,我实际上认为最后一个更容易。

    我想你可以做其他的事情,比如改变列的数据类型,但我假设你只是想改变查询。

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

答案 1 :(得分:1)

我不知道mysql,但在其他RDBMS中,日期假设时间是凌晨12点。如果要包含高日期,请在当天添加1。

答案 2 :(得分:1)

您的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表示匹配“小于或等于”max,所以可能是一天中的时间让你失望。

答案 3 :(得分:1)

如果未指定日期时间,则隐含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'