我正在尝试选择两个日期之间的行。首先,这是我的数据:
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次被遗漏了。我执行此操作的方式有什么问题?
答案 0 :(得分:3)
请参阅this related问题。
正如其他人所说,你的主要问题不在于时间问题。处理这个的几个选项:
使用函数将DateTime转换为Date。我不建议使用此选项,因为它可能会生成函数non-sargeable。
扩展您的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'
使用<
作为上限值
SELECT * FROM `punches` WHERE `date` >= '08/20/11' AND `date` < '09/01/11'
在大多数情况下,我实际上认为最后一个更容易。
我想你可以做其他的事情,比如改变列的数据类型,但我假设你只是想改变查询。
**免责声明:我是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'