2015-10-04 91 views
1

我有一张表格,其中插入年份,月份编号,年份的星期编号和每年记录的年份的日期编号。MySQL在年份和日期之间选择记录

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

我能够根据日期和年份在日期之间选择记录。如果年份相同,查询效果很好,但是一旦我更改了年份,查询就无法正常工作,因为我正在使用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 

回答

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使用索引。你的查询是不可能的。

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

+0

作为一种魅力。谢谢! –

1
SELECT COUNT(id) AS records_count 
FROM table1 
WHERE (year = 2014 and day >= 275) 
    OR (year = 2015 and day <= 176) 

查询,并作为baao评论 - 一个索引日期列是超级快,更容易查询。

+0

OP说明:此答案仅适用于邻近年份(或同一年)。它没有推广到任何一对日期。 –

+0

删除我的评论,因为你已经说过了。 – baao

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))) 
0

的问题是,你想数着有一年于2014年小于或等于和同年大于或等于记录与2015年相比,没有数字小于或等于2014年,同时大于或等于2015年。

相关问题