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

标签 mysql sql

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/

相关文章:

php - 错误消息 "Call to a member function query() on a non-object"

sql - 选择结果作为用户定义的表参数函数中的参数

sql - 如何在 SQL Server 2012 中设置每周自动备份?

mysql - 合并两个sql查询

mysql - 在 mysql 中选择新用户和返回用户的总票数

MYSQL Left Join 返回匹配第一个字符的所有行

c# - 从c#在mysql中创建表

mysql - 聚合 MySQL 子查询的结果

sql - API : How can I remotely check if two data sets are identical, 没有通过 API 发送所有数据?

mysql - 使用IP地址连接到MySql