2010-02-28 78 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