【问题标题】:Split month by week range (Monday-Friday) in SQL Server在 SQL Server 中按周范围(周一至周五)拆分月份
【发布时间】:2018-12-06 06:35:37
【问题描述】:

我正在使用 SQL Server 2008R2,我正在尝试按周划分给定的月份范围。我得到了以下解决方案。但是,我想要(周一至周五)而不是(周日至周六)之间的日子。我该怎么做?

DECLARE @start_date DATETIME, @end_date DATETIME
DECLARE @Table table(StartDate datetime,Enddate datetime,WeekNo int)

SET @start_date = '1 Dec 2018'
SET @end_date =   '31 Dec 2018'

INSERT @Table 
SELECT MIN(dt), MAX(dt), w
FROM
(
    SELECT dt, year(dt) y, DATEPART(week,dt) w
    FROM
    (
        SELECT @start_date + (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1) dt
        FROM sys.columns s1 cross join sys.columns s2
    ) q
    WHERE dt BETWEEN @start_date AND @end_date
) a
group by y,w

Select * from @Table order by startdate, weekno

【问题讨论】:

  • 如果 2018 年 12 月 1 日不是星期一,那么您想要最接近 start_date 的星期一?如果 12 月 31 日不是星期五,你想在最后一个星期五直到 2018 年 12 月 31 日
  • @george-joseph 如果可以的话,那就太好了。否则,常规的一周范围对我来说也可以。 (即 2018 年 12 月 31 日至 2019 年 1 月 4 日)在本月底的情况下
  • 查询中的 weekno 将根据 iso 周定义本身来计算,不是吗?
  • @GeorgeJoseph 是的。如何在本月底的情况下获得常规周范围(即 2018 年 12 月 31 日至 2019 年 1 月 4 日)

标签: sql sql-server-2008-r2 monthcalendar


【解决方案1】:

一种选择是只生成记录并获取@start_date 和@end_date 之间的星期一日期

然后确保考虑边界条件

DECLARE @start_date DATETIME, @end_date DATETIME
DECLARE @Table table(StartDate datetime,Enddate datetime,WeekNo int)

SET @start_date = '1 Nov 2018'
SET @end_date =   '30 Nov 2018'

set datefirst 1;

INSERT @Table 
     SELECT dt as start_of_week
           ,dateadd(dd,4,dt) as end_of_week
           ,DATEPART(week,dt) w
           ,datepart(dw,q.dt)
      FROM
      (
        SELECT @start_date + (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1) dt              
          FROM sys.columns s1 cross join sys.columns s2
       ) q
    WHERE dt BETWEEN @start_date AND @end_date
     AND datepart(dw,q.dt)=1 /*Gets only the days beginning from monday*/
     --AND dateadd(dd,4,q.dt) <= @end_date /*Ignore any records which cross over the @end_date*/

Select * from @Table order by startdate, weekno

【讨论】:

  • 如何在本月底的情况下获得常规周范围(即 2018 年 12 月 31 日至 2019 年 1 月 4 日)
  • 去掉最后一个条件 -- AND dateadd(dd,4,dt)
  • 不,如果我这样做,需要周一到周日。如何获得(2018 年 12 月 31 日至 2019 年 1 月 4 日)
  • 如果是 2018 年 11 月,则从 2018 年 11 月 5 日开始,而不是 10 月 29 日。(常规周)
  • 今天学到了新东西->先设置日期。我已更新代码以设置 datefirst 1。您现在可以看到 2018 年 11 月 1 日的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 2017-09-16
  • 1970-01-01
  • 2021-12-31
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多