Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пересечение периодов / 25 сообщений из 41, страница 1 из 2
28.01.2019, 16:34
    #39766025
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
Здравствуйте!

Есть данные по промо. Каждое промо имеет дату начала и дату окончания.
...
Рейтинг: 0 / 0
28.01.2019, 16:35
    #39766027
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
Нужно выгрузить те промо, которые пересекаются с декабрем 2018 г.

Написал такой SQL-запрос.
SQL-запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
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. Есть ли специальные встроенные функции или необходимость в создании встроенной функции для поиска пересечении периодов?
...
Рейтинг: 0 / 0
28.01.2019, 16:38
    #39766031
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
Вот тут, страдалец,
https://www.sql.ru/forum/1308064/nayti-vse-neperesekaushhiesya-i-nesmezhnye-promezhutki-vremeni
многократно написано условие пересечения.
Есть даже с null...
...
Рейтинг: 0 / 0
28.01.2019, 16:39
    #39766033
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
ferzmikkесли в полях [discount_begin] и/или [discount_end] присутствуют NULLИ как же интерпретируются NULLы?
...
Рейтинг: 0 / 0
28.01.2019, 16:39
    #39766034
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
ferzmikk,

Код: sql
1.
2.
discount_begin <= @discount_end AND
discount_end >= @discount_begin


это как-то странно
авторКаждое промо имеет дату начала и дату окончания.
автор[discount_begin] и/или [discount_end] присутствуют NULL
но что-то типа

Код: sql
1.
2.
ISNULL(discount_begin,0) <= @discount_end AND
ISNULL(discount_end,999999) >= @discount_begin
...
Рейтинг: 0 / 0
28.01.2019, 17:04
    #39766062
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
TaPaK,

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

discount_begin <= @discount_end AND
discount_end >= @discount_begin

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

Должно быть 4 для прямоугольника и 6 для куба.
...
Рейтинг: 0 / 0
28.01.2019, 17:49
    #39766088
Asic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
ferzmikk,

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

Код: sql
1.
2.
where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end
...
Рейтинг: 0 / 0
28.01.2019, 18:00
    #39766094
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
Asicferzmikk,

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

Код: sql
1.
2.
where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end


Полный бред
...
Рейтинг: 0 / 0
29.01.2019, 07:30
    #39766273
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
Спасибо!
...
Рейтинг: 0 / 0
29.01.2019, 09:48
    #39766314
Asic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
TaPaKAsicferzmikk,

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

Код: sql
1.
2.
where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end


Полный бред

Это ведь заменит условие:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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



разве нет?
...
Рейтинг: 0 / 0
29.01.2019, 09:55
    #39766319
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
Asic,

если перевсти, то если период начался раньше и закончился поже периода отбора, то он по вашему не должен попасть
...
Рейтинг: 0 / 0
29.01.2019, 10:03
    #39766330
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
TaPaKAsic,

если перевсти, то если период начался раньше и закончился поже периода отбора, то он по вашему не должен попасть
4-й вариант не отбирает
...
Рейтинг: 0 / 0
29.01.2019, 10:05
    #39766331
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
ferzmikkTaPaKAsic,

если перевсти, то если период начался раньше и закончился поже периода отбора, то он по вашему не должен попасть
4-й вариант не отбирает
можно ещё 20 нарисовать которые будут что-то не делать
...
Рейтинг: 0 / 0
29.01.2019, 10:24
    #39766337
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
TaPaKferzmikkпропущено...

4-й вариант не отбирает
можно ещё 20 нарисовать которые будут что-то не делать
21796027
4-й вариант это discount со значением 0004. На скриншоте видно, что должно попасть
...
Рейтинг: 0 / 0
29.01.2019, 10:26
    #39766340
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
ferzmikkTaPaKпропущено...

можно ещё 20 нарисовать которые будут что-то не делать
21796027
4-й вариант это discount со значением 0004. На скриншоте видно, что должно попасть
Я потерял нить ваших аргументов.
Предлагает:
авторусловие попроще

where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end
при таком попадёт только ваш 4й вариант и всё, о чём вы?
...
Рейтинг: 0 / 0
29.01.2019, 10:30
    #39766343
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
Надо кофе пить :) я и себя уже не понимаю
...
Рейтинг: 0 / 0
29.01.2019, 10:36
    #39766347
Asic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
TaPaK,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
29.01.2019, 10:40
    #39766349
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
AsicTaPaK,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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


Всё равно нет
...
Рейтинг: 0 / 0
29.01.2019, 10:43
    #39766351
Asic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
TaPaKAsic,

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

Так да, период начался раньше и закончился позже периода отбора и он попал в выборку
...
Рейтинг: 0 / 0
29.01.2019, 10:45
    #39766353
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
AsicTaPaKAsic,

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

Так да, период начался раньше и закончился позже периода отбора и он попал в выборку
это явно не ваше
...
Рейтинг: 0 / 0
29.01.2019, 10:45
    #39766354
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
TaPaKferzmikkпропущено...

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
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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	



TaPaKferzmikk,
Код: sql
1.
2.
discount_begin <= @discount_end AND
discount_end >= @discount_begin

Отбираются все 4 варианта


Asicferzmikk,

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

Код: sql
1.
2.
where discont_begin between @discount_begin and @discount_end
or discount_end between @discount_begin and @discount_end

Отбирает 1, 2 и 3 варианты.
...
Рейтинг: 0 / 0
29.01.2019, 11:16
    #39766370
Asic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
ferzmikk,

Код: sql
1.
2.
3.
4.
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
...
Рейтинг: 0 / 0
29.01.2019, 11:20
    #39766374
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
Asicferzmikk,

Код: sql
1.
2.
3.
4.
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


Всё ещё нет
...
Рейтинг: 0 / 0
29.01.2019, 11:37
    #39766383
Asic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
TaPaK,
что я упустил?
...
Рейтинг: 0 / 0
29.01.2019, 11:41
    #39766384
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пересечение периодов
AsicTaPaK,
что я упустил?
бессмысленность
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пересечение периодов / 25 сообщений из 41, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]