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

Откуда: Раменское
Сообщений: 52
Добрый день, друзья!

Есть задачка найти "дырку" в диапазонах дат.
Например, сотрудник работал:
1. с 2017-05-05 по 2017-05-20
2. с 2017-05-21 по 2017-05-28
3. с 2017-06-01 по 2017-06-02
4. с 2017-06-03 по 2017-06-06

Нам нужно выбрать строку 2 и 3, так как между ними есть "дырка".
Какие у Вас есть варианты?
6 июн 17, 22:42    [20545049]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Mitresky,

Оконные функции LEAD/LAG
7 июн 17, 00:36    [20545266]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Без оконных функций подумай о том, что дырка, это там, где (ТекущаяДата-ПредыдущаяДата) > 1.
7 июн 17, 09:37    [20545599]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
Mitresky
Member

Откуда: Раменское
Сообщений: 52
Remind
Mitresky,

Оконные функции LEAD/LAG


Не получится, забыл сказать, что MS SQL 2008, даже не r2.
7 июн 17, 10:11    [20545697]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
Mitresky
Member

Откуда: Раменское
Сообщений: 52
Mitresky
Remind
Mitresky,

Оконные функции LEAD/LAG


Не получится, забыл сказать, что MS SQL 2008, даже не r2.



На 2012 получилось. Перекинул данные в другую БД. Спасибо.
7 июн 17, 10:18    [20545720]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
tashkafox
Member

Откуда: Москва
Сообщений: 106
Mitresky
Remind
Mitresky,

Оконные функции LEAD/LAG


Не получится, забыл сказать, что MS SQL 2008, даже не r2.

Можно было бы пронумеровать строки таблицы с помощью row_number() и сджойнить таблицу на саму себя по условию t1.rn = t2.rn-1.
В t2 будет следующая строка.
7 июн 17, 11:28    [20546059]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
Добрый Э - Эх
Guest
tashkafox,

а ещё можно было бы:
... намутить outer apply с top 1 подзапросом,
... заюзать not exists
... или придумать пару-тройку других вариантов

но автору проще, оказалось, перейти на другую версию СУБД... :) ;)
7 июн 17, 11:56    [20546266]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4210
tashkafox
Mitresky
пропущено...


Не получится, забыл сказать, что MS SQL 2008, даже не r2.

Можно было бы пронумеровать строки таблицы с помощью row_number() и сджойнить таблицу на саму себя по условию t1.rn = t2.rn-1.
В t2 будет следующая строка.

Можно не заморачиваться с окнноыми функциями - у каждой даты можно вычислить номер дня в году и использовать его.
Правда в этом случае необходимо обработку проводить по каждому году отдельно.
7 июн 17, 12:53    [20546544]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 42
SQL2008
tashkafox
пропущено...

Можно было бы пронумеровать строки таблицы с помощью row_number() и сджойнить таблицу на саму себя по условию t1.rn = t2.rn-1.
В t2 будет следующая строка.

Можно не заморачиваться с окнноыми функциями - у каждой даты можно вычислить номер дня в году и использовать его.
Правда в этом случае необходимо обработку проводить по каждому году отдельно.

А если просто дату сконвертировать в целое число (а дата и есть целое число), то получим сквозную нумерацию через все года..
7 июн 17, 13:46    [20546757]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4210
petre
SQL2008
пропущено...

Можно не заморачиваться с окнноыми функциями - у каждой даты можно вычислить номер дня в году и использовать его.
Правда в этом случае необходимо обработку проводить по каждому году отдельно.

А если просто дату сконвертировать в целое число (а дата и есть целое число), то получим сквозную нумерацию через все года..

Не получим.
После 31-го числа идет 1, а вовсе не 32-е (Барон Мюгнхаузен, извини!)
7 июн 17, 13:52    [20546789]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
SQL2008
petre
пропущено...

А если просто дату сконвертировать в целое число (а дата и есть целое число), то получим сквозную нумерацию через все года..

Не получим.
После 31-го числа идет 1, а вовсе не 32-е (Барон Мюгнхаузен, извини!)

DATEDIFF и ваш барон идёт лесом
7 июн 17, 13:59    [20546839]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
Mitresky
Member

Откуда: Раменское
Сообщений: 52
Добрый Э - Эх
tashkafox,

а ещё можно было бы:
... намутить outer apply с top 1 подзапросом,
... заюзать not exists
... или придумать пару-тройку других вариантов

но автору проще, оказалось, перейти на другую версию СУБД... :) ;)



Это разовый запрос от заказчика, поэтому и перекинул данные в другую БД. Если понадобится регулярный отчет, то, конечно, буду иначе писать.
7 июн 17, 18:11    [20548055]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Например, сотрудник работал:
1. с 2017-05-05 по 2017-05-20
Как это физически хранится в БД ? Есть поля день/сотрудник ?
Если есть, то сделать таблицу календарь со всеми датами.
Указать выходные дни.
Сделать к этой таблице подзапрос case when Exists(...) then 'Работал' else 'Сачковал' end.
(профит)
8 июн 17, 10:48    [20549214]     Ответить | Цитировать Сообщить модератору
 Re: Пробел в диапазонах дат  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7762
Mitresky,

дырки в датах обнаруживаются сверкой с календарём.
8 июн 17, 11:04    [20549274]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить