我有一张表格,我在其中插入年份,月份编号,年份的周数和每个记录的年份。
我使用这些字段来过滤记录而不是完整日期,因为我有数百万条记录,我想通过比较整数而不是日期来提高性能。
我能够根据日期编号和年份选择日期之间的记录。如果年份相同,查询效果很好,但是一旦我更改年份,查询就无法工作,因为我使用的是AND。
表格如下:
这是工作查询
SELECT COUNT(id) AS records_count
FROM table1
WHERE table1.day >= 176
AND table1.day <= 275
AND table1.year <= 2015
AND table1.year >= 2015
这是我需要调整的查询
SELECT COUNT(id) AS records_count
FROM table1
WHERE table1.day >= 275
AND table1.day <= 176
AND table1.year <= 2014
AND table1.year >= 2015
答案 0 :(得分:1)
SELECT COUNT(id) AS records_count
FROM table1
WHERE (year = 2014 and day >= 275)
OR (year = 2015 and day <= 176)
正如baao所评论的那样 - 索引日期列超快且易于查询。
答案 1 :(得分:1)
您存储日期的方法完全不符合您的要求。一般形式是:
where (year = 2014 and day >= 275 or year > 2014) and
(year = 2015 and day <= 176 or year < 2015)
这适用于任何一年,而不仅仅是相隔一年的那些年。
现在,如果您正常存储日期,那么您只需执行以下操作:
where date >= makedate(2014, 275) and date <= makedate(2015, 176)
这个结构的真正,非常好的是MySQL可以在date
上使用索引。您的查询无法做到这一点。
通常,微观优化(例如使用整数而不是其他数据类型)在关系数据库中是不值得的。通常,读取数据的成本比连续处理的成本高得多。事实上,这个例子就是一个很好的例子。当您可以完全使用索引删除对它们的需求时,为什么还要尝试提高比较速度?
答案 2 :(得分:0)
广义解决方案(例如,可以从2000年到2020年)
SELECT COUNT(id) AS cnt
FROM tbl
WHERE ((year > under_min_year and year < above_max_year)
and ((year <> min_year and year <> max_year)
or (year = min_year and day > 265)
or (year = max_year and day < 300)))
答案 3 :(得分:0)
问题在于您要计算年份小于或等于2014年且同年大于或等于2015年的记录。没有数字小于或等于2014年且同时大于或等于2015年