sql - 根据周将日期部分转入上一年

标签 sql sql-server

我现在正在学习 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,所以找不到结果?)但我不知道如何让它向后看返还额外的几周。

最佳答案

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

这种方法的优点是保证返回过去 12 周的记录,即使其中不正好是 12 周(例如,如果周系列中有间隙),或者 future 的记录存在。

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 .

关于sql - 根据周将日期部分转入上一年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54064117/

相关文章:

sql - SQL Compact Edition 是否支持聚集索引?

java - SQLite删除列: Using temporary table vs Renaming using ALTER TABLE的方法

sql - 在 Apache Ignite 中以客户端模式运行 SQL 扫描查询时出现问题

sql - 使用外键,我可以在复合主键中引用固定值吗?

c# - 帮助 sql select 语法

java - 如何根据搜索值从jtable和sql数据库中删除搜索行

asp.net - 使用 EF 的 sql server 数据库镜像不适用于我的 asp.net 应用程序

sql - 将列值加一

sql - FETCH NEXT 到类似表的结构中

mysql - 在特定条件下连接两个表