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

Есть данные по промо. Каждое промо имеет дату начала и дату окончания.
...
Рейтинг: 0 / 0
Пересечение периодов
    #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
Пересечение периодов
    #39766031
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут, страдалец,
https://www.sql.ru/forum/1308064/nayti-vse-neperesekaushhiesya-i-nesmezhnye-promezhutki-vremeni
многократно написано условие пересечения.
Есть даже с null...
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766033
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkесли в полях [discount_begin] и/или [discount_end] присутствуют NULLИ как же интерпретируются NULLы?
...
Рейтинг: 0 / 0
Пересечение периодов
    #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
Пересечение периодов
    #39766062
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

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

discount_begin <= @discount_end AND
discount_end >= @discount_begin

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

Должно быть 4 для прямоугольника и 6 для куба.
...
Рейтинг: 0 / 0
Пересечение периодов
    #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
Пересечение периодов
    #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
Пересечение периодов
    #39766273
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
Пересечение периодов
    #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
Пересечение периодов
    #39766319
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Asic,

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

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

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

4-й вариант не отбирает
можно ещё 20 нарисовать которые будут что-то не делать
21796027
4-й вариант это discount со значением 0004. На скриншоте видно, что должно попасть
...
Рейтинг: 0 / 0
Пересечение периодов
    #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
Пересечение периодов
    #39766343
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо кофе пить :) я и себя уже не понимаю
...
Рейтинг: 0 / 0
Пересечение периодов
    #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
Пересечение периодов
    #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
Пересечение периодов
    #39766351
Asic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKAsic,

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

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

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

Так да, период начался раньше и закончился позже периода отбора и он попал в выборку
это явно не ваше
...
Рейтинг: 0 / 0
Пересечение периодов
    #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
Пересечение периодов
    #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
Пересечение периодов
    #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
Пересечение периодов
    #39766383
Asic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,
что я упустил?
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766384
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AsicTaPaK,
что я упустил?
бессмысленность
...
Рейтинг: 0 / 0
25 сообщений из 41, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пересечение периодов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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