日期停止时SQL中所有记录的输出日期(必须是一个月的间隔)

时间:2017-11-29 15:35:41

标签: sql sql-server tsql date sql-server-2005

我有这个问题,我有月跳的数据。正如您所见,记录日期总是一次跳1个月。

我需要为01/01/2017生成一个新行。基本上我需要在每个月有一个差距时生成一个新行。

我怎么能这样做?财政周只是一个月的一周,月只是月,而年只是一年。周数是运行的一周,几年前开始并且不断积累,我可以在一个特殊的表中查找这不是问题,我只需要使用周,年,月来获取它并使用最小值或最大值(第一个或者那个月的最后一周)

[Week Num] [Record Date] [Record Date] [Fiscal Year] [Fiscal Month] [Fiscal Week] [Customer #] [Group Description]
158        01/10/2016    NULL          2016          10             41            12345        aDrive
162        01/11/2016    NULL          2016          11             45            12345        aDrive
166        01/12/2016    NULL          2016          12             49            12345        aDrive

基本上我不想生成十月,十一月,我想生成LAST记录,其中没有后续记录但也没有间隙。

帮帮我。

1 个答案:

答案 0 :(得分:0)

我试着理解你的问题。 尝试以下查询,也许它可以帮助您。但是我不知道它可能在SQLServer 2005中不起作用,因为我在这里使用了递归CTE。

DECLARE @ToDate date
SET @ToDate='20171201' -- we'll calculate new rows until this date

;WITH monthCTE AS(
  -- get the last row from your table
  SELECT [Week Num],[Record Date],[Fiscal Year],[Fiscal Month],[Fiscal Week],[Customer #],[Group Description]
  FROM
    (
      SELECT TOP 1 *
      FROM [Your data]
      ORDER BY [Week Num] DESC
    ) q

  UNION ALL

  -- calculate the next row
  SELECT
    [Week Num]+DATEDIFF(WEEK,[Record Date],[New Record Date]),
    [New Record Date],
    YEAR([New Record Date]),
    MONTH([New Record Date]),
    CASE
      WHEN MONTH([New Record Date])=1 THEN 1 -- return 1 if it is the first month in the year
      ELSE [Fiscal Week]+DATEDIFF(WEEK,[Record Date],[New Record Date])
    END,
    [Customer #],
    [Group Description]
  FROM
    (
      SELECT
        [Week Num],[Record Date],[Fiscal Year],[Fiscal Month],[Fiscal Week],[Customer #],[Group Description],
        DATEADD(MONTH,1,[Record Date]) [New Record Date] -- add one month to the previous date
      FROM monthCTE
      WHERE [Record Date]<@ToDate
    ) q
)
SELECT [Week Num],[Record Date],[Fiscal Year],[Fiscal Month],[Fiscal Week],[Customer #],[Group Description]
FROM [Your data]

UNION -- this operation also exclude duplicate for the last row

SELECT [Week Num],[Record Date],[Fiscal Year],[Fiscal Month],[Fiscal Week],[Customer #],[Group Description]
FROM monthCTE

ORDER BY [Week Num]

如果我理解你并且有效,那么你需要检查所有表达的准确性。