sql server 2008中的循环问题

时间:2013-03-01 19:43:40

标签: sql-server-2008

我遇到了查询问题:

select week_number
    ,year
from accounting_calender
where week_number<=3
and week_number>3-6
and year=2013

在此查询中,我通过报告工具传递week_number 3和年2013

我得到以下输出:

| Week_number | year |
----------------------
|    3        | 2013 |
|    2        | 2013 |
|    1        | 2013 |

但是在我的会计日历表中,我也返回了2012年的参赛作品。

所以我在这里减去-6,所以它也要去上一周。

我正在寻找以下输出:

| Week_number | year |
----------------------
|   51        | 2012 |
|   52        | 2012 |
|   53        | 2012 |
|    3        | 2013 |
|    2        | 2013 | 
|    1        | 2013 |

我有只读权限。

2 个答案:

答案 0 :(得分:1)

将您的周和年转换为日期将使您更容易执行日期范围的添加:

DECLARE @Week_Number INT
DECLARE @Year INT
DECLARE @WeeksToGet INT

SET @Week_Number = 3
SET @Year = 2013
SET @WeeksToGet = 6

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

SET @EndDate = DATEADD(WEEK, @Week_Number, DATEADD(YEAR, @Year - 1900, 0))
SET @StartDate= DATEADD(WEEK, -6, @EndDate)

select
    week_number,
    year
from accounting_calender
where 
    DATEADD(WEEK, week_number, DATEADD(YEAR, year - 1900, 0)) between
    @StartDate AND @EndDate

但请注意,这会模糊您在week_numberyear上的所有索引。如果这是一个问题,您可以考虑将这些列更改为DATE类型,以便您可以避免将这两列转换为一个日期。

Sql Fiddle

答案 1 :(得分:1)

您需要添加一个特殊情况,其中前6周跨越一年边界:

select
  week_number,
  year
from
  accounting_calender
where
  (week_number > @week-6 and week_number <= @week and year=@year)
or
  (week_number > @week-6+53 and year=@year-1)

如果@week >= 6,则第二个条件将始终为> 53,因此无效。但是,如果@week < 6,那么前一年的第二个条件为5251等。