首页 > 解决方案 > 根据周将日期划分为上一年

问题描述

我目前正在学习 SQL,并且需要一个能够返回前 12 周(不包括当前周)的查询,并且以下内容运行良好 - 直到我们进入 2019 年!

我的表有 4 列,BuildWeek、BuildYear、Info1、Info2,都是 int。

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,所以找不到结果?)但我不确定如何让它向后看归还那些额外的几周。

标签: sqlsql-server

解决方案


假设您每周有一行:

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;

或者,如果您想使用 awhere 并且years 有 52 周:

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

如果年份可以有 53 周,这种方法会变得有点棘手。


推荐阅读