sql-server - 如何获得一年中所有剩余的月份+接下来的 4 年
问题描述
我正在尝试编写一个 t-sql 函数,它返回一个日期表(代表月份),从下个月开始,一直持续到 4 年后的最后一个月。例如:1.7.2019 1.8.2019 ... 1.12.2023
也许我正在搜索错误的关键字,但我找不到合适的解决方案。
解决方案
使用计数表非常简单。我保留一个作为我系统的视图。这会产生 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
推荐阅读
- c# - 正则表达式替换除大小写“{0}”之外的所有花括号
- c# - 关于财产变更
- javascript - Vuejs - 基于其他计算属性的计算属性
- mongodb - Mongodb 聚合性能和可扩展性
- android - 使用文本时钟作为项目的回收器视图上的空指针异常
- css - Ipad Pro 高度不对齐
- java - 如何将方法 StageHelper.getStages() 从 java 1.7 替换为 java 11
- javascript - 如何在 nuxt 中制作 *.vue 文件
- android - 使用 EditText 过滤 ListView
- wordpress - 如何在不裁剪的情况下调整 WooCommerce 图像的大小?