用于筛选配置日期列表的SQL查询

时间:2013-10-13 03:04:49

标签: sql sql-server date logic

如果我希望下表中的日期/记录使得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

2 个答案:

答案 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