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

Откуда:
Сообщений: 2059
Здравствуйте!

Есть данные по промо. Каждое промо имеет дату начала и дату окончания.

К сообщению приложен файл. Размер - 21Kb
28 янв 19, 16:34    [21796027]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
Нужно выгрузить те промо, которые пересекаются с декабрем 2018 г.

Написал такой SQL-запрос.
+SQL-запрос
Declare @Таблица table(
	[discount] nvarchar(4),
	[discount_begin] date,
	[discount_end] date
)
;
INSERT INTO
  @Таблица 
VALUES 
('0001','24.11.2018','10.12.2018'), --Вариант 1
('0002','10.12.2018','05.01.2019'), --Вариант 2
('0003','24.12.2018','28.12.2018'), --Вариант 3
('0004','22.11.2018','07.01.2019'), --Вариант 4
('0005','21.11.2018','29.11.2018'), --Не должно отобраться
('0006','05.01.2019','07.01.2019'); --Не должно отобраться

--Задаем анализируемый период - Декабрь 2018
DECLARE @discount_begin date = '01.12.2018'
DECLARE @discount_end date = '31.12.2018'

SELECT
	[discount],
	[discount_begin],
	[discount_end]
FROM
	@Таблица
WHERE
	(discount_begin <= @discount_begin AND @discount_begin <= discount_end AND discount_end <= @discount_end ) --для варианта 1
	OR
	(@discount_begin <= discount_begin AND discount_begin <= @discount_end AND @discount_end <= discount_end)--для варианта 2
	OR
	(@discount_begin <= discount_begin AND discount_end <= @discount_end)--для варианта 3
	OR
	(discount_begin <= @discount_begin AND @discount_end <= discount_end)--для варианта 4	
В Where написал так, что теоретически для каждого варианта написал условие. Условие получилось сложное. Но запрос работает.

Как можно было проще написать условие? Желательно с учетом такого фактора, если в полях [discount_begin] и/или [discount_end] присутствуют NULL. Есть ли специальные встроенные функции или необходимость в создании встроенной функции для поиска пересечении периодов?
28 янв 19, 16:35    [21796029]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
aleks222
Member

Откуда:
Сообщений: 959
Вот тут, страдалец,
https://www.sql.ru/forum/1308064/nayti-vse-neperesekaushhiesya-i-nesmezhnye-promezhutki-vremeni
многократно написано условие пересечения.
Есть даже с null...
28 янв 19, 16:38    [21796033]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
iap
Member

Откуда: Москва
Сообщений: 46978
ferzmikk
если в полях [discount_begin] и/или [discount_end] присутствуют NULL
И как же интерпретируются NULLы?
28 янв 19, 16:39    [21796035]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

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

discount_begin <= @discount_end AND
discount_end >= @discount_begin

это как-то странно
автор
Каждое промо имеет дату начала и дату окончания.

автор
[discount_begin] и/или [discount_end] присутствуют NULL

но что-то типа

ISNULL(discount_begin,0) <= @discount_end AND
ISNULL(discount_end,999999) >= @discount_begin
28 янв 19, 16:39    [21796036]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4730
TaPaK,

Естественно это упирается в два условия.

discount_begin <= @discount_end AND
discount_end >= @discount_begin

Для особо продвинутых предлагаю написать условие пересечь прямоугольники и кубы.

Должно быть 4 для прямоугольника и 6 для куба.
28 янв 19, 17:04    [21796070]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
Asic
Member

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

условие попроще

where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end
28 янв 19, 17:49    [21796115]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Asic
ferzmikk,

условие попроще

where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end

Полный бред
28 янв 19, 18:00    [21796128]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
Спасибо!
29 янв 19, 07:30    [21796443]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
Asic
Member

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

условие попроще

where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end

Полный бред


Это ведь заменит условие:
WHERE
	(discount_begin <= @discount_begin AND @discount_begin <= discount_end AND discount_end <= @discount_end ) --для варианта 1
	OR
	(@discount_begin <= discount_begin AND discount_begin <= @discount_end AND @discount_end <= discount_end)--для варианта 2
	OR
	(@discount_begin <= discount_begin AND discount_end <= @discount_end)--для варианта 3
	OR
	(discount_begin <= @discount_begin AND @discount_end <= discount_end)--для варианта 4


разве нет?
29 янв 19, 09:48    [21796506]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

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

если перевсти, то если период начался раньше и закончился поже периода отбора, то он по вашему не должен попасть
29 янв 19, 09:55    [21796512]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
ferzmikk
Member

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

если перевсти, то если период начался раньше и закончился поже периода отбора, то он по вашему не должен попасть

4-й вариант не отбирает
29 янв 19, 10:03    [21796524]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ferzmikk
TaPaK
Asic,

если перевсти, то если период начался раньше и закончился поже периода отбора, то он по вашему не должен попасть

4-й вариант не отбирает

можно ещё 20 нарисовать которые будут что-то не делать
29 янв 19, 10:05    [21796526]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
TaPaK
ferzmikk
пропущено...

4-й вариант не отбирает

можно ещё 20 нарисовать которые будут что-то не делать

21796027
4-й вариант это discount со значением 0004. На скриншоте видно, что должно попасть
29 янв 19, 10:24    [21796536]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

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

можно ещё 20 нарисовать которые будут что-то не делать

21796027
4-й вариант это discount со значением 0004. На скриншоте видно, что должно попасть

Я потерял нить ваших аргументов.
Предлагает:
автор
условие попроще

where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end

при таком попадёт только ваш 4й вариант и всё, о чём вы?
29 янв 19, 10:26    [21796541]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Надо кофе пить :) я и себя уже не понимаю
29 янв 19, 10:30    [21796547]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
Asic
Member

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

declare 
@BeginPromo date ='20181201',
@EndPromo date ='20181230',
@BeginGoodSales date ='20181203',
@EndGoodSales date ='20181220';

select 1
where @BeginGoodSales between @BeginPromo and @EndPromo
or @EndGoodSales between @BeginPromo and @EndPromo
29 янв 19, 10:36    [21796554]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

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

declare 
@BeginPromo date ='20181201',
@EndPromo date ='20181230',
@BeginGoodSales date ='20181203',
@EndGoodSales date ='20181220';

select 1
where @BeginGoodSales between @BeginPromo and @EndPromo
or @EndGoodSales between @BeginPromo and @EndPromo

Всё равно нет
29 янв 19, 10:40    [21796562]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
Asic
Member

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

если перевсти, то если период начался раньше и закончился поже периода отбора, то он по вашему не должен попасть


Так да, период начался раньше и закончился позже периода отбора и он попал в выборку
29 янв 19, 10:43    [21796565]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

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

если перевсти, то если период начался раньше и закончился поже периода отбора, то он по вашему не должен попасть


Так да, период начался раньше и закончился позже периода отбора и он попал в выборку

это явно не ваше
29 янв 19, 10:45    [21796568]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
ferzmikk
Member

Откуда:
Сообщений: 2059
TaPaK
ferzmikk
пропущено...

21796027
4-й вариант это discount со значением 0004. На скриншоте видно, что должно попасть

Я потерял нить ваших аргументов.
Предлагает:
автор
условие попроще

where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end

при таком попадёт только ваш 4й вариант и всё, о чём вы?
Когда я писал условие, то я исходил такой логикой, что для попадания в анализируемый период теоретически возможно 4 варианта:
1. Промо началось ранее анализируемого периода (в данном случае это декабрь 2018) и закончилось в анализируемом периоде.
2. Промо началось в анализируемом периоде, но закончилось позже анализируемого периода
3. Промо началось и закончилось внутри анализируемого периода
4. Промо начало ранее анализируемого периода и закончилось позже анализируемого периода

Из этих пунктов получилось сложное условие
ferzmikk
WHERE
	(discount_begin <= @discount_begin AND @discount_begin <= discount_end AND discount_end <= @discount_end ) --для варианта 1
	OR
	(@discount_begin <= discount_begin AND discount_begin <= @discount_end AND @discount_end <= discount_end)--для варианта 2
	OR
	(@discount_begin <= discount_begin AND discount_end <= @discount_end)--для варианта 3
	OR
	(discount_begin <= @discount_begin AND @discount_end <= discount_end)--для варианта 4	


TaPaK
ferzmikk,
discount_begin <= @discount_end AND
discount_end >= @discount_begin
Отбираются все 4 варианта


Asic
ferzmikk,

условие попроще

where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end
Отбирает 1, 2 и 3 варианты.
29 янв 19, 10:45    [21796569]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
Asic
Member

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

where 
        discount_begin between @discount_begin and @discount_end
	or discount_end between @discount_begin and @discount_end
	or @discount_begin between discount_begin and discount_end
29 янв 19, 11:16    [21796595]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Asic
ferzmikk,

where 
        discount_begin between @discount_begin and @discount_end
	or discount_end between @discount_begin and @discount_end
	or @discount_begin between discount_begin and discount_end

Всё ещё нет
29 янв 19, 11:20    [21796599]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
Asic
Member

Откуда:
Сообщений: 45
TaPaK,
что я упустил?
29 янв 19, 11:37    [21796620]     Ответить | Цитировать Сообщить модератору
 Re: Пересечение периодов  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Asic
TaPaK,
что я упустил?

бессмысленность
29 янв 19, 11:41    [21796621]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить