2

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

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

4 回答 4

3

请参阅此相关问题。

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

  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. 使用 a<作为上限值

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

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

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

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

于 2011-08-30T17:59:33.477 回答
1

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

于 2011-08-30T17:50:54.950 回答
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 文档说它匹配“小于或等于”最大值,所以这可能是一天中让你失望的时候。

于 2011-08-30T17:52:32.297 回答
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'
于 2011-08-30T17:53:24.857 回答