Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 DATEADD  [new]
Profit7
Member

Откуда:
Сообщений: 7
Доброго времени суток.
Прошу помощи.
Как с помощью запроса просмотреть всю таблицу выявить отсутствующие даты и добавить их в таблицу.
Скажем
10.03.2017
11.03.2017
15.03.2017
16.03.2017
24.03.2017

Можно конечно ручками
автор
INSERT INTO [dbo].[table]
SELECT
[table] = (SELECT DATEADD(DAY, 1, '2017-03-10'))
FROM [dbo].[Tasks1] WHERE [DataBegin] = '2017-03-10'

Ну при большом объеме. (((
25 окт 17, 02:17    [20897282]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Profit7
Доброго времени суток.
Прошу помощи.
Как с помощью запроса просмотреть всю таблицу выявить отсутствующие даты и добавить их в таблицу.
Скажем
10.03.2017
11.03.2017
15.03.2017
16.03.2017
24.03.2017

Можно конечно ручками
автор
INSERT INTO [dbo].[table]
SELECT
[table] = (SELECT DATEADD(DAY, 1, '2017-03-10'))
FROM [dbo].[Tasks1] WHERE [DataBegin] = '2017-03-10'

Ну при большом объеме. (((

Если взять из интернета
WITH cte_day AS
(
SELECT CAST('2003-04-01' AS DATE) d -- минимальная дата
UNION ALL
SELECT DATEADD(DAY, 1, d) d
FROM cte_day
WHERE DATEADD(DAY, 1, d) <= CAST('2003-04-07' AS DATE) -- максимальная дата
)
SELECT * FROM cte_day
И допилить, Ваша таблица table1, даты в столбце date1, минимальная дата (select top 1 [date1] from [table1] order by [date] ASC), максимальная дата (select top 1 [date1] from [table1] order by [date] DESC), далее полученный cte связываете left join с существующей таблицей table1 и в случае where table1.date1 is null - вставляете в table1.
А обязательно одним запросом или можно через временную таблицу?
25 окт 17, 02:28    [20897284]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
Profit7
Member

Откуда:
Сообщений: 7
Andy_OLAP
А обязательно одним запросом или можно через временную таблицу?

Суть я уловил, создать таблицу в правильным диапазоном дат и потом джоинить. Должен же быть вариант как это сделать одним простым запросом.
25 окт 17, 02:54    [20897289]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
Добрый Э - Эх
Guest
Profit7,

если версия сервера позволяет - {lead | lag} over() для формирования интервалов пропусков, а далее как в предыдущем ответе - генерировать последовательность дат в пределах каждого интервала с пропусками
25 окт 17, 04:13    [20897291]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
Massa52
Member

Откуда:
Сообщений: 379
Profit7,
Еще генератор диапазона
WITH Numbers(N) AS(SELECT CAST('2003-04-01' AS DATETIME) UNION ALL SELECT N+1 FROM Numbers WHERE N < CAST('2003-04-01' AS DATETIME)+6)
SELECT CAST(N AS DATETIME) FROM Numbers ORDER BY N OPTION(MAXRECURSION 0);
25 окт 17, 11:06    [20897903]     Ответить | Цитировать Сообщить модератору
 Re: DATEADD  [new]
Profit7
Member

Откуда:
Сообщений: 7
Спасибо всем, действительно сгенерить временную табличку оказалось самым простым решением.
Спасибо за помощь. Задача решена, хоть я и проспал сегодня, но заснуть было сложно без получения решения. :)
25 окт 17, 14:54    [20899251]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить