【问题标题】:Populating a list of dates from a few date ranges in SQL server从 SQL Server 中的几个日期范围填充日期列表
【发布时间】:2016-01-25 06:40:27
【问题描述】:

我有一长串包含日期范围和费用的帐户,例如,这里有两行:

Account    Start_date   End_date    Cost
Megadeal    11/6/2015   13/6/2015   1000$ 
Superstar   12/8/2014   14/8/2014   2000$ 

我需要用每个范围内的所有日期填充一个列表,每天一行,每天用帐户名称和费用填充。结果应该是这样的:

Megadeal    11/6/2015   1000
Megadeal    12/6/2015   1000
Megadeal    13/6/2015   1000
Superstar   12/8/2014   2000
Superstar   13/8/2014   2000
Superstar   14/8/2014   2000

意味着每次从不同的范围(不同的开始日期和结束日期)填充日期列表。

有什么建议吗?

【问题讨论】:

标签: sql-server date


【解决方案1】:

您可以使用Tally Table 来生成日期:

DECLARE @maxDiff INT;

SELECT @maxDiff = MAX(DATEDIFF(DAY, Start_Date, End_Date)) FROM tbl;

WITH E1(N) AS( -- 10 ^ 1 = 10 rows
    SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)
),
E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10 ^ 2 = 100 rows
E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10 ^ 4 = 10,000 rows
E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10 ^ 8 = 10,000,000 rows
CteTally(N) AS(
    SELECT TOP(@maxDiff + 1) ROW_NUMBER() OVER(ORDER BY(SELECT NULL))
    FROM E8
)
SELECT
    t.Account,
    Date = DATEADD(DAY, ct.N - 1, t.Start_Date),
    t.Cost
FROM tbl t
CROSS JOIN CteTally ct
WHERE DATEADD(DAY, ct.N - 1, t.Start_Date) <= t.End_Date
ORDER BY t.Account, Date;

【讨论】:

  • 谢谢!这个解决方案效果很好,可以生成一个多年范围内的日期列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多