【发布时间】:2021-12-27 00:00:39
【问题描述】:
我正在尝试创建一个包含以下行的表:
| Date | Value |
|---|---|
| 01/01/2021 | 1.0 |
| 01/02/2021 | 0.5 |
| 01/02/2021 | 0.5 |
| 01/03/2021 | 0.33 |
| 01/03/2021 | 0.33 |
| 01/03/2021 | 0.33 |
| 01/04/2021 | 0.25 |
| 01/04/2021 | 0.25 |
| 01/04/2021 | 0.25 |
| 01/04/2021 | 0.25 |
我在下面的尝试似乎只运行内部语句,外部语句是多余的,但是当我自己运行外部语句时,它会返回所有结束日期组合。
我确定我遗漏了一些非常简单的东西。
提前致谢。
SET DATEFORMAT dmy;
SET @start = '01/09/2021'
SET @end = '01/09/2025'
SET @counter = 1
WHILE (@end> @start)
BEGIN
WHILE (@counter < DATEDIFF(m,@start,@end))
BEGIN
INSERT INTO #timerevert (mon,frac)
VALUES( @end, 1 / (datediff(m,@start,@end)*1.0) )
SET @counter = @counter + 1
END
SET @end = dateadd(mm,-1,@end)
END
【问题讨论】:
-
Protip:你不需要
WHILE循环,也不需要#temporary表。相反,尝试考虑如何使用集合理论运算来描述数据(提示:您的Value显然是Date的函数)。 -
它使用 SET DATEFORMAT dmy;一开始,抱歉,这不是创建表和声明变量的完整查询。
-
这是一个简单的基于集合的查询,如果您手头有 数字/计数表,则非常容易。
-
@Stu 我原以为自引用 CTE 会更好地生成行ex nihilo。
-
确认一下,
2021-01-01需要 1 行,2021-01-02需要 2 行,2021-01-03需要 3 行,2021-01-04需要 4 行,2021-12-31需要 365 行?这将是 2021 年总共 66,795 行 - 但您想一直到 2025 年...您确定这就是您想要的吗?我看到您的@start变量是2021-09-01而不是2021-01-01,所以我不确定您真正想要什么...
标签: sql loops while-loop