2010-02-28 90 views

回答

3

這裏是一個廣義的解決方案:

Select... 
From ... 
Where (Year = <StartYear> And Month >= <StartMonth>) 
    Or (Year > <StartYear> And Year < <EndYear>) 
    Or (Year = <EndYear> And Month <= <EndMonth>) 
2

用途:

WHERE (year = 2009 AND month >= 10) 
    OR (year = 2010 AND month <= 2) 

...或者,使用UNION ALL:

SELECT t.* 
    FROM TABLE t 
WHERE year = 2009 AND month >= 10 
UNION ALL 
SELECT t.* 
    FROM TABLE t 
WHERE year = 2010 AND month <= 2 

UNION ALLUNION快,但不會刪除重複。

+0

但是如果從2007年10月到2010年2月呢?你不能只替換日期。 – 2010-02-28 01:02:52

+0

@Daniel Vassallo:我會將這些值存儲爲DATETIME,這樣可以緩解您提出的問題的複雜性。如果需要,我會創建一個視圖來突破日/月/年。 – 2010-02-28 01:10:39

+0

@OMG:是的,DATETIME會很理想,但我認爲OP沒有DAY值。只是月和年。 – 2010-02-28 01:13:55

1

你可能要考慮爲2010年2月創建一個名爲year_month另一列存儲的日期在YYYYMM格式,如201002請務必在其上創建一個索引,並且你還可以創建兩個觸發器自動更新列在INSERT和ON UPDATE上。

那麼你就可以使用:

WHERE year_month BETWEEN 200710 AND 201002 

這將使用索引上year_month

1

接受的答案不適合的情況下工作時,StartYear和EndYear是一樣的。例如。 2017-01至2017-08。覆蓋此情況下,修改後的僞代碼將是

((年= StartYear和月> = StartMonth)OR(年> StartYear))AND((年= EndYear和月< = EndMonth)OR(年< EndYear))

+0

1701和1710不一樣。 – apriori 2017-06-09 12:43:44

+0

澄清了這個例子,我的意思是2017-01(Jan)和2017-10(Oct),這是一個失敗的例子。 – Peder 2017-06-09 14:38:28

相關問題