Поиск всех дат после даты за переменное количество дней - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть список дат в таблице. Для этого примеры 1-го числа каждого месяца. Давайте назовем его табличным периодом времени со столбцом endTime

endTime
1-1-2019
2-1-2019
3-1-2019
4-1-2019

Я хочу найти в списке все даты x количество дней после каждой даты. Допустим, x = 4. Тогда список должен быть:

1-1-2019
1-2-2019
1-3-2019
1-4-2019
2-1-2019
2-2-2019
2-3-2019
2-4-2019
3-1-2019
3-2-2019
3-3-2019
3-4-2019
4-1-2019
4-2-2019
4-3-2019
4-4-2019

Я нашел решения, чтобы найти все даты между датами, но я продолжаю получать "Подзапрос вернул более 1 значения" ошибка когда я пытаюсь использовать его со списком дат.

Вот пример того, что я пробовал, но не работает

declare @days DECIMAL = 4
declare @StartDate date = (select convert(varchar, DATEADD(Day, +0, endTime),101) from timeperiod
declare @EndDate date = (select convert(varchar, DATEADD(Day, +@days, endTime),101) from timeperiod;

;WITH cte AS (
    SELECT @StartDate AS myDate
    UNION ALL
    SELECT DATEADD(day,1,myDate) as myDate
    FROM cte
    WHERE DATEADD(day,1,myDate) <=  @EndDate
)
SELECT myDate
FROM cte
OPTION (MAXRECURSION 0)

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Вот генератор строк, который генерирует 5 строк, от 0 до 4:

WITH rg AS (
   SELECT 0 AS rn
   UNION ALL
   SELECT rg.rn + 1
   FROM   rg
   WHERE  rn < 4
)

Здесь мы соединяем его с вашей существующей таблицей с первыми месяцами и используем DATEADD для добавления rn чисел дней (от 0 до 4) до конечного периода. Соединение CROSS привело к тому, что строки в timePeriod повторялись 5 раз каждый:

SELECT
  DATEADD(DAY, rg.rn, timePeriod.endTime) as fakeEndTime
FROM
  rg CROSS JOIN timePeriod

Мне было не совсем понятно, когда вы говорите «дни X дней после даты, скажите x = 4» - мне, если есть это день с 1 января 2000 г., затем через 4 дня после 5 января 2000 г.

Если вы хотите, чтобы только 1, 2, 3 и 4 января сделали генератор строк < 3 вместо < 4

0 голосов
/ 30 апреля 2020

Уже +1 на рекурсивном caius Jard.

Вот еще один вариант использования таблицы подсчета ad-ho c совместно с CROSS JOIN

Пример

Declare @YourTable Table ([endTime] date)
Insert Into @YourTable Values 
 ('1-1-2019')
,('2-1-2019')
,('3-1-2019')
,('4-1-2019')

Select NewDate = dateadd(DAY,N-1,EndTime)
 From @YourTable A
 Cross Join ( 
                Select Top (4) N=row_number() over (order by (select null)) 
                 From  master..spt_values N1
            ) B

Возвращает

NewDate
2019-01-01
2019-01-02
2019-01-03
2019-01-04
2019-02-01
2019-02-02
2019-02-03
2019-02-04
2019-03-01
2019-03-02
2019-03-03
2019-03-04
2019-04-01
2019-04-02
2019-04-03
2019-04-04
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...