У меня есть столбец в таблице, содержащий даты. Я хочу создать таблицу, содержащую диапазон дат для каждой даты в столбце. Например, таблица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, который определяет базовый синтаксис для всех реляционных баз данных.
Другое решение для этого,
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;
вот результат.