2015-10-04 68 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年。

相關問題