http://upic.me/i/hq/capture.png
http://upic.me/i/3g/capture.png
我有将日期时间划分为单个字段的表格,并将这些字段设置为索引。 我想在日期范围ex中使用where子句。在2010/06/21至2011/05/15之间 我尝试使用
where concat_ws('-',year,month,day) between '2010/06/21' and '2011/05/15'
这是有效的,因为我使用concat函数来调整这些字段,就像普通的日期时间一样 但它没有慢慢使用索引和查询。这个表有300万条记录
如果要使用索引我尝试这个查询
where
year = '2011'
and month between 05 and 06
and day between 21 and 15
它几乎可以工作,但在最后一行 21至15日 我不能用这个条件 我试图解决这个问题,但我找不到它并更改了structer表 我正在寻找答案
现在我可以通过OR操作查询感谢您的回答 在另一种情况下,如果要找到2009/08/20至2011/04/15它会使用更长的查询并混淆。有人有想法吗?
答案 0 :(得分:1)
如果是日期戳类型,您可以直接使用where / between子句。我会考虑切换到它,它比具有自定义日期格式的varchar快得多。
WHERE yourdate BETWEEN "2011-05-01" AND "2011-06-15"
尽管检查范围可能会持续一个月,但您会发现,如果您在几个月之间查询会有一些误差,因为如果您考虑一下,那么您选择的数量超出了您的预期。使用Datestamp将修复因将日期存储在自定义varchar中而导致的性能和可用性问题。
如果您有兴趣,可以使用以下两个查询来转换您的时间:
ALTER TABLE `yourtable` ADD `newdate` DATE NOT NULL;
UPDATE `yourtable` SET `newdate` = STR_TO_DATE(`olddate`, '%Y/%m/%d');
只需将“yourtable”,“newdate”和“olddate”分别更改为表名,新日期列名和旧日期戳列名。
答案 1 :(得分:1)
如果您无法更改表格结构,可以使用以下内容:
WHERE year = '2011'
AND ((month = '05' AND day >= 21) OR (month = '06' AND day <= '15'))
(至少,我认为查询会在您的特定情况下执行您想要的操作。但是对于例如更长的时间段,您必须再次考虑查询,并且我怀疑这样的查询可能会变得很痛苦维持)
更新
原则保持不变,只有查询变得更复杂。对于2009/08/20
到2011/04/15
的范围,它可能如下所示:
WHERE year = '2009' AND (month = '08' AND day >= '20' OR month BETWEEN '09' AND '12')
OR year = '2010'
OR year = '2011' AND (month BETWEEN '01' AND '03' OR month = '04' AND day <= '15')
答案 2 :(得分:0)
年份= 2011年 和(5月6日之间)和(日> 20或白天<16)
你分开的日子和月份,而你必须把它们放在一起
必须设置括号......
麦克
答案 3 :(得分:0)
使用OR非常重要,否则是无意义的