2

我的查询遇到问题:

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

在这个查询中,我通过我的报告工具传递了 week_number3和 year 。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 |

我有只读权限。

4

2 回答 2

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_number和上的任何索引year。如果这是一个问题,您可以考虑将这些列更改为一种DATE类型,这样您就可以避免将两列转换为一个日期。

Sql 小提琴

于 2013-03-01T20:04:41.177 回答
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,等等。

于 2013-03-01T20:05:27.923 回答