Как получить все оставшиеся месяцы года + следующие 4 года - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь написать функцию t-sql, которая возвращает таблицу дат (представляющих месяц), начиная со следующего месяца и продолжая до последнего месяца через 4 года.Например: 1.7.2019 1.8.2019 ... 1.12.2023

Возможно, я ищу неправильные ключевые слова, но не могу найти подходящее решение.

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Это довольно просто, используя таблицу подсчета. Я держу один как взгляд на мою систему. Это генерирует 10 000 неприятных постов. Вы можете прочитать больше о таблицах учета от Джеффа Модена здесь .

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
0 голосов
/ 04 июня 2019

Вам действительно нужна таблица или просто нужны значения данных? Если вам нужны только данные, вам нужно только это:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...