根据星期

时间:2019-01-06 17:28:24

标签: sql sql-server

此刻我正在学习SQL,需要一个查询来返回前12周(不包括当前周),下面的查询工作得很好-直到我们进入2019年为止!

我的表有4列,即BuildWeek,BuildYear,Info1,Info2,都为整数。

select * 
from Dashboard 
where BuildWeek in (datepart(week, getdate()) - 1, 
                    datepart(week, getdate()) - 2,  
                    datepart(week, getdate()) - 3,  
                    datepart(week, getdate()) - 4,  
                    datepart(week, getdate()) - 5,
                    datepart(week, getdate()) - 6, 
                    datepart(week, getdate()) - 7, 
                    datepart(week, getdate()) - 8, 
                    datepart(week, getdate()) - 9, 
                    datepart(week, getdate()) - 10, 
                    datepart(week, getdate()) - 11, 
                    datepart(week, getdate()) - 12, 
                    datepart(week, getdate()) - 13)
  and BuildYear = datepart(year, getdate()) 
order by 
    BuildWeek desc

我知道这不是最干净的查询,因此我很乐于接受教育,我已经尝试了一些方法(使用dateadd毫无用处),但似乎无法使其按我的意愿运行。我猜测以上可能来自查询(可能是负号)(当前日期-1为0,-2为-1,所以找不到结果?),但是我不确定如何使其向后看退还多余的几周。

2 个答案:

答案 0 :(得分:0)

假设您每周有一行:

select top (12) d.*
from Dashboard d
order by d.year desc, d.BuildWeek desc;

为避免以后的几周:

select top (12) d.*
from Dashboard d
where year < year(getdate()) or
      (year = year(getdate()) and buildweek <= datepart(week, getdate())
order by d.year desc, d.BuildWeek desc;

或者,如果您想使用where 并且年有52周:

select d.*
from dashboard d
where (y.year * 52 + buildweek) >= year(getdate()) * 52 + datepart(week, getdate());

如果几年可以有53个星期,则此方法会变得有些棘手。

答案 1 :(得分:0)

另一种解决方案是从BuildWeekBuildYear生成一个日期(例如一周中的第一天),该日期可以在WHERE子句中使用。

此方法的优点是可以保证返回最近12周的记录,即使其中不完全是12个(例如,如果您在周系列中有间隔),或者将来的记录也存在。

SELECT d.*
FROM Dashboard d
WHERE 
    DATEADD( wk, DATEDIFF( wk, 7, CAST( d.BuildYear AS NVARCHAR(100) ) ) + (d.BuildWeek-1) , 7 )
        BETWEEN DATEADD( week, -12, GETDATE() ) AND GETDATE()
ORDER BY 
    d.BuildYear DESC,
    d.BuildWeek DESC

this db fiddle中进行了测试。