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

Откуда:
Сообщений: 31
Подскажите пожалуйста с запросом (SQL server 2008)
Есть таблица intervalproblem в которой колонки:
id "ID записи"
dttmstart "Дата начала проблемы"
dttmend "Дата окончание проблемы"

В таблице могут присутствовать пересечения

id dttmstart dttmend
1 2016-02-14 14:00:00.000 2016-02-14 21:00:00.000
2 2016-02-17 12:30:00.000 2016-02-17 14:30:00.000
3 2016-02-18 02:15:00.000 2016-02-18 02:45:00.000
4 2016-02-18 04:00:00.000 2016-02-19 08:30:00.000
5 2016-02-19 10:00:00.000 2016-02-20 04:15:00.000
6 2016-02-20 19:00:00.000 2016-02-21 20:00:00.000
7 2016-02-21 20:00:00.000 2016-02-22 05:00:00.000
8 2016-02-22 05:00:00.000 2016-02-25 02:45:00.000
9 2016-02-25 04:00:00.000 2016-03-04 06:00:00.000 пересекается
10 2016-02-28 12:15:00.000 2016-02-28 13:45:00.000
11 2016-02-28 13:45:00.000 2016-03-01 06:00:00.000 пересекается


Как написать запрос что б отобразить только записи, где происходит пересечение интервала ?
Заранее спасибо.

К сообщению приложен файл. Размер - 48Kb
4 мар 16, 10:36    [18895506]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ну так для каждой записи найдите подзапросом, есть ли у нее другая запись для которой периоды пересекаются
4 мар 16, 10:38    [18895524]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
rossijanin
Member

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

А можно пожалуйста поподробней
4 мар 16, 10:44    [18895563]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Да кужа уж подробнее то
4 мар 16, 10:46    [18895579]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Glory
Member

Откуда:
Сообщений: 104751
rossijanin
А можно пожалуйста поподробней

Вы умеете писать подзапросы ?
EXISTS, например ?
4 мар 16, 10:46    [18895585]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
rossijanin
Member

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

Не очень
4 мар 16, 10:52    [18895626]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Glory
Member

Откуда:
Сообщений: 104751
rossijanin
Glory,

Не очень

Ну так может имет смысл начать учиться их писать ?
4 мар 16, 10:53    [18895630]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Glory
Member

Откуда:
Сообщений: 104751
Может вы запросы с соединением( JOIN) умеете писать ?
4 мар 16, 10:54    [18895635]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
rossijanin
Member

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

Согласен
4 мар 16, 10:55    [18895638]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
rossijanin
Member

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

Это да
4 мар 16, 10:56    [18895646]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
_djХомяГ
Guest
/* правило пересечения 
A.START<=B.FINISH
A.FINISH>=B.START
*/


declare @t table (id int,fromD datetime,toD datetime)
insert into @t
select 1,'20160214 14:00','20160214 21:00'
union
select 2, '20160217 12:30','20160217 14:30'
union
select 3,'20160225 04:00','20160304 06:00'
union
select 4,'20160228 13:45','20160301 06:00'

select * from @t t where EXISTS 
(select  1 from @t t1 where t.fromD<=t1.toD and t.toD>=t1.fromD and t.id<>t1.id) 
order by fromD,ToD
4 мар 16, 10:56    [18895648]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Glory
Member

Откуда:
Сообщений: 104751
rossijanin
Glory,

Это да

Ну так используйте хотя бы JOIN
4 мар 16, 10:58    [18895660]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
rossijanin
Member

Откуда:
Сообщений: 31
_djХомяГ,

а если пересекающиеся записи каждый раз новые ?
4 мар 16, 11:04    [18895700]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
rossijanin
_djХомяГ,

а если пересекающиеся записи каждый раз новые ?

вот это поворот :)
4 мар 16, 11:06    [18895710]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Glory
Member

Откуда:
Сообщений: 104751
rossijanin
а если пересекающиеся записи каждый раз новые ?

Вот и давай сразу готовое решение, если ТС не понимает, что в нём что.
4 мар 16, 11:06    [18895713]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
rossijanin
Member

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

Ну извините, таблица с постоянно меняющимися интервалами
4 мар 16, 11:11    [18895753]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Glory
Member

Откуда:
Сообщений: 104751
rossijanin
Ну извините, таблица с постоянно меняющимися интервалами

А что это такое ? И чем она отличается от таблицы в примере _djХомяГ ?
4 мар 16, 11:13    [18895771]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
_djХомяГ
Guest
добавьте еще 100500 записей в таблицу , если не лень, и проверьте ))))))))))
4 мар 16, 11:14    [18895773]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
rossijanin,

так в теме и надо было написать "SQL изучать не хочу и не буду, напишите запрос и докажите что он верный"
4 мар 16, 11:15    [18895790]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
rossijanin
Member

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

Изучаю, но еще ламер (((
4 мар 16, 11:21    [18895865]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Turbo Prolog
Member [заблокирован]

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

Может быть вам было бы проще разработать функцию
udf_interval(x1,x2,y1,y2)
которая вернёт 1 если интервал [x1,x2) имеет хотя бы 1 общую точку с интервалом [y1,y2)
и вернёт 0 в противном случае.
А с функцие вам будет работать уже проще, чем с громоздкими выражениями сравнения дат.
Кроме того, функцию достаточно 1 раз написать и отладить, а потом уже не беспокоясь, применять.
4 мар 16, 15:02    [18897376]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Glory
Member

Откуда:
Сообщений: 104751
Turbo Prolog
Кроме того, функцию достаточно 1 раз написать и отладить, а потом уже не беспокоясь, применять.

И как же применть такую вашу функцию для всей таблицы сразу ?
4 мар 16, 15:07    [18897403]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Glory
Turbo Prolog
Кроме того, функцию достаточно 1 раз написать и отладить, а потом уже не беспокоясь, применять.

И как же применть такую вашу функцию для всей таблицы сразу ?

ну извратиться можно всегда, но оно точно того не стоит
CREATE FUNCTION IsCross(@DateFrom datetime,@DateInto datetime)
RETURN int
AS
BEGIN
' проверяем
 RETURN 1
' или
 RETURN 0
END
GO
SELECT 
*,
IsCross(t.DateFrom, t.DateInto) as cross
FROM Table t
WHERE
 cross = 1
4 мар 16, 15:39    [18897575]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
Glory
Member

Откуда:
Сообщений: 104751
TaPaK
ну извратиться можно всегда, но оно точно того не стоит

Turbo Prolog предложил функцию с 4-мя входными параметрами
4 мар 16, 15:41    [18897588]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение интервалов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Glory
TaPaK
ну извратиться можно всегда, но оно точно того не стоит

Turbo Prolog предложил функцию с 4-мя входными параметрами

omg... не заметил :)
4 мар 16, 15:42    [18897597]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить