我有一个SELECT
查询,我希望找到DATE和TIME介于2011-12-11 23:00:00
和2011-12-12 23:00:00
之间的所有行。我尝试使用WHERE但行为空
WHERE (date >= '2011-12-11' AND time > '23:00:00' )
AND (date < '2011-12-12' AND time < '23:00:00' )
请问有什么好的建议如何改变这个?
答案 0 :(得分:5)
您可以使用:
SELECT * FROM table WHERE DATETIME(date) BETWEEN '2011-11-11 23:00:00' AND '2011-12-13 23:00:00'
或分开:
SELECT * FROM table WHERE DATETIME(date) > '2011-12-11 23:00:00' AND DATETIME(date) < '2011-12-13 23:00:00'
我不确定我是否理解您要在此处实现的目标或您的数据库的布局,但假设日期和时间是单独的字段:
SELECT * FROM table WHERE DATETIME(concat(DATE(date),' ',TIME(time))) BETWEEN '2011-11-11 23:00:00' AND '2011-12-13 23:00:00'
我没有测试过,但这可能有用。
答案 1 :(得分:1)
你需要更聪明地构建查询:
WHERE (date = '2011-12-11' AND time > '23:00:00' )
or ( date = '2011-12-12' AND time < '23:00:00' )
对于24小时的窗口,你只需要有2个子句。如果您需要超过24小时的窗口,则需要三个子句,一个用于开始日期,一个用于结束日期,一个用于所有日期:
WHERE (date = '2011-12-11' AND time > '23:00:00' )
or ( date = '2011-12-13' AND time < '23:00:00' )
or (date >='2011-12-12' and date < '2011-12-13')
答案 2 :(得分:1)
哈,我有解决方案而无需重建dbase - 它正在工作:))
WHERE
CONCAT(date,' ',time) >= '2011-12-11 23:00:00'
AND
CONCAT(date,' ',time) < '2011-12-12 23:00:00'
也许对某人有帮助。
感谢所有帮助人们,brgs答案 3 :(得分:0)
TO_DATE('2012-12-11','yyyy-mm-dd')
的操作来转换为比较中的日期类型。
答案 4 :(得分:0)
让我们确定某些事情
date
和time
字段的想法date_time
(类型为DATETIME)的附加列,该列合并了这两个字段。date
和time
字段,并且只有date_time
date_time
这是执行该操作的命令
ALTER TABLE yourtable ADD INDEX date_time (date_time);
一旦你做了这些事情,那么你可以使用看起来像这样的WHERE子句创建一个查询:
WHERE date_time >= '2011-12-11 23:00:00'
AND date_time < '2011-12-12 23:00:00'
如果您无法合并日期和时间字段,您仍然可以创建索引
ALTER TABLE yourtable ADD INDEX date_time (date,time);
鉴于这种情况,您可以创建一个带有WHERE子句的查询,如下所示:
WHERE (date >= '2011-12-11' AND time >= '23:00:00')
AND (date <= '2011-12-12' AND time < '23:00:00')
任何一种情况的EXPLAIN计划都应该导致使用date_time索引快速执行查询。
试一试!!!