如果我希望下表中的日期/记录使得Year大于或等于2012且Month大于9月,我该如何形成查询。
此查询不起作用它带来了2012年(7,8,9,10,11,12),2013年(1到12),这是不对的,因为我想看2012(9,10,11,12) )2013年(1至12)。它包括2012年的第7个月和第8个月
select * from ConfigurationDate
where Year >= 2012 OR ( Year = 2012 AND Month >= 9 )
Order By Year,Month ASC
表架构
DateId INT Auto Inc
Year INT
Month INT
虚拟数据
DateId Year Month
1 2012 7
2 2012 8
3 2012 9
4 2012 10
5 2012 11
6 2012 12
7 2013 1
8 2013 2
9 2013 3
10 2013 4
11 2013 5
12 2013 6
13 2013 7
14 2013 8
15 2013 9
16 2013 10
答案 0 :(得分:1)
1)此解决方案导致执行计划包括Index Scan
。您可以使用UNION ALL来允许两个Index Seek
:
select ...explicit list of columns... from ConfigurationDate
where Year = 2012 AND Month >= 9
union all
select ...explicit list of columns... from ConfigurationDate
where Year > 2012
Order By Year,Month ASC
我使用了union all
因为这两组谓词([1] Year = 2012 AND Month >= 9
和[2] Year > 2012
)没有重叠。
2)如果您有[SMALL] [DATE] TIME列,则可以使用
select ...explicit list of columns... from ConfigurationDate
where MyDateColumn >= '20120901'
答案 1 :(得分:0)
实际上考虑到这一点,我不需要将2012年的日期再次列入第一条件,因为它已被第二个条件所覆盖。所以答案如下:
select * from ConfigurationDate
where Year > 2012 OR ( Year = 2012 AND Month >= 9 )
Order By Year,Month ASC