如何获取一年中所有剩余的月份和接下来的4年

时间:2019-06-04 12:37:38

标签: sql-server tsql

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

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

2 个答案:

答案 0 :(得分:1)

使用理货单这非常简单。我在系统上保留一个视图。这样会很快产生10,000个讨厌的东西。您可以从Jeff Moden here阅读有关计数表的更多信息。

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

答案 1 :(得分:0)

您真的需要一个表还是只需要数据值?如果只需要数据,则只需要这样做:

WITH mnths as (
  select dateadd(month, datediff(month, 0, getdate()) + 1, 0) as mnth UNION ALL -- start date begining of next month
  select DATEADD(month,1,mnth) FROM mnths WHERE mnth< dateadd(month, -1, dateadd(year, datediff(year, 0, getdate()) + 5, 0)) -- end date - add 5 years to current year start and remove 1 month
)
select * FROM mnths

并非如此,如果您更改日期值并且结果最终检索到100多行,则需要添加额外的一行并将MAXRECURSION选项设置为更高的值(例如1000)

WITH mnths as (
  select dateadd(month, datediff(month, 0, getdate()) + 1, 0) as mnth UNION ALL -- start date begining of next month
  select DATEADD(month,1,mnth) FROM mnths WHERE mnth< dateadd(month, -1, dateadd(year, datediff(year, 0, getdate()) + 5, 0)) -- end date - add 5 years to current year start and remove 1 month
)
select * FROM mnths
OPTION (MAXRECURSION 1000)