按时间间隔生成记录(每周,每月,每季度,每年)

时间:2011-09-02 18:56:41

标签: sql tsql sql-server-2008

我需要在给定的开始日期,结束日期和时间频率(每周,每月等)上生成记录。

示例1:

  1. 开课日期:2011年1月15日
  2. 截止日期:2011年12月31日
  3. 频率:每月
  4. 生成的报告:

    1. 1月15日至1月31日

    2. 2月1日 - 2月28日(2月29日闰年)

    3. 3月1日至3月31日

    4. 。 。

      • 12月1日至12月31日

      示例-2

      • 开课日期:2011年1月15日
      • 截止日期:2011年12月31日
      • 频率:每周

      生成的报告:

      • 1月1日至1月16日

      • 1月2日至17日 - 1月23日

      • 1月3月24日至1月30日

      。 。

      • 12月50日至26日 - 12月31日

      与季度相同。

      任何帮助

1 个答案:

答案 0 :(得分:1)

我认为你所问的基本上是如何循环数月/周/季。

这应该会给你一个良好的开端,让你指出我希望的正确方向。您只需要使用内置的SQL日期函数(如DATEADD, DATEDIFF & DATEPART

DECLARE @startDate DATETIME
DECLARE @endDate DATETIME
DECLARE @TimePeriod NVARCHAR(50)
DECLARE @RptDate DATETIME

SET @startDate = '1/15/2011'
SET @endDate = '12/31/2011'
SET @TimePeriod = 'Monthly'

SET @RptDate = @startDate
WHILE @RptDate < @endDate
BEGIN
    PRINT @RptDate      --- This prints out the dates I think you want
    IF @TimePeriod = 'Monthly'
        SET @RptDate = DATEADD(mm, 1, DATEADD(dd, -DAY(@RptDate) + 1,@RptDate))

    IF @TimePeriod = 'Weekly'
        SET @RptDate = DATEADD(ww, 1, DATEADD(dd, -DATEPART(weekday,@RptDate) + 1,@RptDate))

    IF @TimePeriod = 'Quarterly'
        SET @RptDate = DATEADD(qq, 1, DATEADD(qq, DATEDIFF(qq, 0, @RptDate), -1) + 1)

END