如何在单独的日期时间(年,月,日)中使用where子句

时间:2011-06-05 15:24:56

标签: mysql sql

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它会使用更长的查询并混淆。有人有想法吗?

4 个答案:

答案 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/202011/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非常重要,否则是无意义的