SQL Server WHERE子句使用Week和Year

时间:2018-11-08 19:23:57

标签: sql-server

我有一个存储过程,该存储过程将查询基于WEEK和YEAR的表,但是我希望WHERE子句包含当前日期的星期和年的偏移量。我希望偏移量是当前日期之前的8周。

通常这不是问题,因为我可以简单地在WHERE子句中进行BETWEEN,但是当我们到一年的年底,例如第50周和第8周前进时,则是第二年的第6周。因此,我需要一个WHERE子句,可以区别对待一年中的​​这个时候。我不确定如何构造它,有没有办法拥有一个可以处理同一年以及跨两年的WHERE子句?

这是一开始让我从桌子上得到我想要的几周的样子:

DECLARE @startweek int;
DECLARE @endweek int;
DECLARE @startyear int;
DECLARE @endyear int;

SET @startweek = DatePart(week,getdate())
SET @startyear = DatePart(year,getdate())
SET @endweek = DatePart(week,DateAdd(week,8,getdate()))
SET @endyear = DatePart(year,DateAdd(week,8,getdate()))

SELECT * from SomeTable st
WHERE st.week between @startweek and @endweek

-您可以假设SomeTable在表中具有星期,年份,order_number和客户字段

(以上内容在同年的数据库中可以工作数周,但如果@startweek = 50和@endweek = 8,则无效。我将如何编写此代码来处理任何一个cenario?谢谢!)

2 个答案:

答案 0 :(得分:1)

我假设除了st.week外,您还拥有st.year。如果您只有st.week,这很容易。无论哪种方式,一种方式都是使用派生的WHERE子句。

在伪代码中,

WHERE (
  @startyear = @endyear   --same year
  AND st.week BETWEEN @startweek and @endweek
  AND st.year = @startyear
) OR (
  @startyear < @endyear  --spans the end of year
  AND (
    st.week > @startweek AND st.year = @startyear
  ) OR (
    st.week < @endweek AND st.year = @endyear
  )
)

如果您的表没有year列,则只需从上面删除引用它的位。

答案 1 :(得分:0)

这是你的追求吗?

DECLARE @startweek INT = 50;
DECLARE @endweek int;
DECLARE @startyear INT = 2018;
DECLARE @endyear int;

SELECT 
    @endweek = DATEPART(WEEK, ed.enddate),
    @endyear = DATEPART(YEAR, ed.enddate)
FROM
    ( VALUES (DATEADD(WEEK, @startweek, DATEFROMPARTS(@startyear, 1, 1))) ) sd (startdate)
    CROSS APPLY ( VALUES (DATEADD(WEEK, 8, sd.startdate)) ) ed (enddate)


SELECT 
    startweek = @startweek,
    endweek  = @endweek,
    startyear = @startyear,
    endyear   = @endyear;

结果...

startweek   endweek     startyear   endyear
----------- ----------- ----------- -----------
50          7           2018        2019