http://upic.me/i/hq/capture.png
http://upic.me/i/3g/capture.png
我有一个将日期时间划分为单个字段并将这些字段设置为索引的表。 我想在日期范围内使用 where 子句。 2010年6月21日至2011年5月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 日期间 我无法使用这个条件 我尝试解决这个问题,但找不到它并更改结构表 我正在寻找答案
谢谢
现在我可以进行 OR 运算来查询,谢谢您的回答 在另一种情况下,如果要查找 2009/08/20 到 2011/04/15 它会使用更长的查询并造成困惑。有人知道吗?
最佳答案
如果是日期戳类型,可以直接使用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”分别更改为表名称、新日期列名称和旧日期戳列名称。
关于mysql - 如何在单独的日期时间(年,月,日)中使用where子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6243828/