如果我希望在T-SQL中第一周的第一天,我该如何编写查询

时间:2013-12-02 18:37:46

标签: sql

如果我希望第1个月的第1天属于第1周,我该如何编写查询。我的报告需要显示来自SUN-SAT.so的数据, 如果我当前以任何方式运行报告,它应该只显示SUN-Sat上周的数据。 即使10月27日在10月的第5周下降,我也需要在11月1日的第一周中显示10月27日至11月1日的跌幅。 十一周。

这就是我想在11月份的报告中显示日期范围的方法。并且适用相同的逻辑 每个月。

第1周10/27至11/02

第2周11/03至11/09

第3周11/10至11/16

第4周11/17至11/23

第5周11/24至11/30

所以,我不计算到十月的第四周而不是第五周,因为我计算第五周为第一周 十一月。

同样明智的是,JAN的第一周将是12月29日至01/04。我不想算12月的第5周,因为如果 我相信,会有重复。

谢谢。我很感激。

1 个答案:

答案 0 :(得分:0)

简单来说,整周“属于”特定月份,基于该周的星期六所在的月份。然后,您希望向后工作并计算给定月份,即属于的所有星期的集合那个月。

这将为您提供正向计算:

declare @date date = getdate();
select month(dateadd(day,7+datediff(day,@date,'2000-01-01')%7,@date))

反向计算:

declare @year int = 2013
declare @month int = 11
select
  datefromparts(@year,@month,1) as month,
  dateadd(day,i*7+datediff(day,datefromparts(@year,@month,1),'2000-01-01')%7-6,datefromparts(@year,@month,1)) week_start,
  dateadd(day,i*7+datediff(day,datefromparts(@year,@month,1),'2000-01-01')%7  ,datefromparts(@year,@month,1)) week_end
from (values(1),(2),(3),(4),(5)) wk(i)
  • 我使用datediff(day,@ date,@ known_date)而不是datepart(dw,@ date),因为它是确定性的。