我遇到了查询问题:
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 |
我有只读权限。
答案 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_number
和year
上的所有索引。如果这是一个问题,您可以考虑将这些列更改为DATE
类型,以便您可以避免将这两列转换为一个日期。
答案 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
,那么前一年的第二个条件为52
,51
等。