此刻我正在学习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,所以找不到结果?),但是我不确定如何使其向后看退还多余的几周。
答案 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)
另一种解决方案是从BuildWeek
和BuildYear
生成一个日期(例如一周中的第一天),该日期可以在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中进行了测试。