首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql server 2008中的循环问题

sql server 2008中的循环问题
EN

Stack Overflow用户
提问于 2013-03-02 03:43:40
回答 2查看 51关注 0票数 2

我的查询遇到了一些问题:

代码语言:javascript
复制
select week_number
    ,year
from accounting_calender
where week_number<=3
and week_number>3-6
and year=2013

在这个查询中,我通过我的报告工具传递了week_number 3和year 2013

我得到了以下输出:

代码语言:javascript
复制
| Week_number | year |
----------------------
|    3        | 2013 |
|    2        | 2013 |
|    1        | 2013 |

但在我的会计日历表中,我也返回了2012年的条目。

所以这里我在减去-6,所以它也必须回到前一年的几周。

我正在寻找类似以下输出的内容:

代码语言:javascript
复制
| Week_number | year |
----------------------
|   51        | 2012 |
|   52        | 2012 |
|   53        | 2012 |
|    3        | 2013 |
|    2        | 2013 | 
|    1        | 2013 |

我拥有只读访问权限。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-02 04:05:28

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

代码语言:javascript
复制
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等。

票数 1
EN

Stack Overflow用户

发布于 2013-03-02 04:04:41

将周和年转换为日期将使向日期范围添加内容变得更加容易:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15165587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档