MySQL在一年中的一天和一年之间选择记录

时间:2015-10-04 12:31:56

标签: mysql sql date select date-range

我有一张表格,我在其中插入年份,月份编号,年份的周数和每个记录的年份。

我使用这些字段来过滤记录而不是完整日期,因为我有数百万条记录,我想通过比较整数而不是日期来提高性能。

我能够根据日期编号和年份选择日期之间的记录。如果年份相同,查询效果很好,但是一旦我更改年份,查询就无法工作,因为我使用的是AND。

表格如下:

  • ID
  • 完整日期

这是工作查询

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

4 个答案:

答案 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年