Создайте диапазон дат с помощью SQL для каждой даты в столбце таблицы

У меня есть столбец в таблице, содержащий даты. Я хочу создать таблицу, содержащую диапазон дат для каждой даты в столбце. Например, таблица1 может выглядеть так:

  id    mydate
  1     06/07/2024
  8     05/03/2024

Мне нужна таблица из приведенной выше таблицы следующим образом (2 дня до и 2 дня после для каждой даты в столбце mydate:

  id   yourdate
   1    06/09/2024
   1    06/08/2024
   1    06/07/2024
   1    06/06/2024
   1    06/05/2024
   8    05/05/2024
   8    05/04/2024
   8    05/03/2024
   8    05/02/2024
   8    05/01/2024

Здесь есть решенный более простой вопрос Создайте диапазон дат с помощью SQL.

🤔 А знаете ли вы, что...
SQL имеет стандарт ANSI SQL, который определяет базовый синтаксис для всех реляционных баз данных.


50
3

Ответы:

Другое решение для этого,


SELECT *
FROM (
    SELECT id, mydate AS yourdate
    FROM initial_table
    UNION ALL
    SELECT id, mydate + INTERVAL '1' DAY AS yourdate
    FROM initial_table
    UNION ALL
    SELECT id, mydate + INTERVAL '2' DAY AS yourdate
    FROM initial_table
    UNION ALL
    SELECT id, mydate - INTERVAL '1' DAY AS yourdate
    FROM initial_table
    UNION ALL
    SELECT id, mydate - INTERVAL '2' DAY AS yourdate
    FROM initial_table
) t
ORDER BY id, yourdate;

Функция Oracle должна быть такой:

SELECT
    t.id,
    t.mydate + d.day_diff AS yourdate
FROM
    initial_table t
JOIN (
    SELECT -2 AS day_diff
    UNION ALL SELECT -1
    UNION ALL SELECT 0
    UNION ALL SELECT 1
    UNION ALL SELECT 2
) d
ON 1 = 1
ORDER BY
    t.id,
    yourdate;

Для этого есть решение MYSQL,

SELECT
    t.id,
    DATE_ADD(t.mydate, INTERVAL d.day_diff DAY) AS yourdate
FROM
    initial_table t
JOIN (
    SELECT -2 AS day_diff
    UNION ALL SELECT -1
    UNION ALL SELECT 0
    UNION ALL SELECT 1
    UNION ALL SELECT 2
) d
ON 1 = 1
ORDER BY
    t.id,
    yourdate;

вот результат.


Решено

Еще один:

select id, mydate + level - 3 as yourdate
from data 
connect by level <= 5 and prior id = id and prior sys_guid() is not null;