按时间段分组记录

时间:2018-05-04 20:59:17

标签: tsql sql-server-2016 datepart

我正在尝试用户选择的时间范围,然后将选择分组为时间段 - 在这种情况下:2周。

例如,今天是5/4/2018,如果我将其设置为我的开始日期和5/31/2018作为我的结束日期,我会得到以下内容:

DECLARE @StartDate DATE ,
    @EndDate   DATE ,
    @ToDate    DATE;

SET @StartDate = GETDATE ();
SET @EndDate = '20180531';
SET @ToDate = DATEADD ( DAY, 1, @EndDate );

SELECT dd.Date ,
   ROW_NUMBER () OVER ( ORDER BY DATEPART ( WEEK, dd.Date )) AS [rownumb]
FROM   dbo.DateDimension AS [dd]
WHERE  dd.Date >= @StartDate
   AND dd.Date < @ToDate;

结果如下:

Date        rownumb
2018-05-04  1
2018-05-05  2
2018-05-06  3
2018-05-07  4
2018-05-08  5
2018-05-09  6
2018-05-10  7
2018-05-11  8
2018-05-12  9
2018-05-13  10
2018-05-14  11
2018-05-15  12
2018-05-16  13
2018-05-17  14
2018-05-18  15
2018-05-19  16
2018-05-20  17
2018-05-21  18
2018-05-22  19
2018-05-23  20
2018-05-24  21
2018-05-25  22
2018-05-26  23
2018-05-27  24
2018-05-28  25
2018-05-29  26
2018-05-30  27
2018-05-31  28

我正在玩ROW_NUMBER(以及RANK和DENSE_RANK)但是我无法获得这些功能来完成我正在寻找的东西,但我希望做的是有一个名为“TimePeriod”的附加列,其中日期按2周增量(或14天)组合在一起,以便5/4/18到5/17/18的“TimePeriod”列和5/18/18到5/31 /的值为1对于“TimePeriod”列,18的值为2。这应该是动态的,以便更广泛的日期范围按两周的时间段分组,每个期间增加1.

建议?

1 个答案:

答案 0 :(得分:1)

如果没有要求在sql中使用排序和排名功能,您可以轻松实现如下。

  • 获取开始日期和结束日期之间的总天数
  • 对于每个日期,您从总天数中减去当前日期的天差,然后将其除以14
  • 所以这基本上会给你当前日期所属的间隔(2周),它基于零,所以你可能想要为它添加1

    DECLARE @StartDate DATE,     @EndDate DATE,     @ToDate DATE;

    DECLARE @DaysDiff INT;

    SET @StartDate = GETDATE(); SET @EndDate ='20180531'; SET @ToDate = DATEADD(DAY,1,@ EndDate); - 获取开始日期和结束日期之间的天数差异 SET @DaysDiff = DATEDIFF(Day,@ StartDate,@ ToDate)

    SELECT dd.Date,     (@DaysDiff - DATEDIFF(Day,dd.Date,@ ToDate))/ 14
    来自dbo.DateDimension AS [dd] 在哪里dd.Date&gt; = @StartDate    AND dd.Date&lt; @ToDate;