日期停止时 SQL 中所有记录的输出日期(必须是一个月的间隔)
Posted
技术标签:
【中文标题】日期停止时 SQL 中所有记录的输出日期(必须是一个月的间隔)【英文标题】:Output date for all records in SQL when date stops (must be one month gaps) 【发布时间】:2018-05-13 09:05:08 【问题描述】:我有这个问题,我有月份跳跃的数据。如您所见,记录日期总是一次跳跃 1 个月。
我需要为 01/01/2017 生成一个新行。基本上我需要在每月有一个间隙时生成一个新行。
我怎么能这样做?财政周就是月中的一周,月就是月,年就是年。 Week num 是几年前开始并不断累积的一周,我可以在一个特殊的表格中查找这不是问题,我只需使用周、年、月来获取它并使用 min 或 max (第一个或该月的最后一周)
[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
基本上我不想生成 10 月、11 月,我想生成没有后续记录但也没有间隙的 LAST 记录。
帮帮我。
【问题讨论】:
SQL Server 2005 嗯?我什至无法理解你在这里想要做什么。 “我有这个问题,我有月份跳跃的数据。”好的...所以在您的示例代码中说明这一点。提供什么不清楚。您必须在 2016 年 1 月 12 日之后获得更多数据吗? 【参考方案1】:我试图理解你的问题。 试试下面的查询,也许它会对你有所帮助。但我不知道它是否在 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]
如果我理解正确并且有效,那么您需要检查所有表达式的准确性。
【讨论】:
以上是关于日期停止时 SQL 中所有记录的输出日期(必须是一个月的间隔)的主要内容,如果未能解决你的问题,请参考以下文章