MySQL select 日期和年份之间的记录

MySQL select records between day of the year and year

我有一个 table,我在每条记录中插入年、月、年中的周数和年中的天数。

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

我能够 select 根据天数和年份在日期之间进行记录。如果年份相同,查询将运行良好,但一旦我更改年份,查询将不起作用,因为我使用的是 AND。

Table 看起来像这样:

这是工作查询[=​​14=]

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
SELECT COUNT(id) AS records_count
FROM table1
WHERE (year = 2014 and day >= 275)
   OR (year = 2015 and day <= 176)

正如 baao 评论的那样 - 索引日期列超级快且更容易查询。

您存储日期的方法完全不符合您的要求。一般形式为:

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 上使用索引。您的查询不可能做到这一点。

一般来说,微优化(例如使用整数而不是其他一些数据类型)在关系数据库中是不值得的。通常,读取数据的成本比在一行内处理要昂贵得多。事实上,这个例子就是一个很好的例子。当您可以使用索引完全消除对它们的需求时,为什么要尝试提高比较速度?

广义解(例如可以从 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)))

问题是你想计算年份小于或等于 2014 且同年大于或等于 2015 的记录。没有小于或等于 2014 且同时大于或等于的数字比 2015 年。