首页 > 解决方案 > 如何获得一年中所有剩余的月份+接下来的 4 年

问题描述

我正在尝试编写一个 t-sql 函数,它返回一个日期表(代表月份),从下个月开始,一直持续到 4 年后的最后一个月。例如:1.7.2019 1.8.2019 ... 1.12.2023

也许我正在搜索错误的关键字,但我找不到合适的解决方案。

标签: sql-servertsql

解决方案


使用计数表非常简单。我保留一个作为我系统的视图。这会产生 10,000 令人讨厌的快速。您可以在此处阅读更多关于 Jeff Moden 的计数表的信息。

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally
GO

现在我们可以利用这个计数表来生成您需要的数据。我们只需要使用一点日期数学来隔离您想要的月份。

select dateadd(month, t.N - 1, dateadd(month, datediff(month, 0, getdate()) + 1, 0))
from cteTally t
where t.N <= datediff(month
                , dateadd(month, datediff(month, 0, getdate()) + 1, 0) --beginning of next month
                , dateadd(year, datediff(year, 0, getdate()) + 1, 0) --beginning of next year
                ) + 48 --add 48 because the next four years of months are static

推荐阅读