powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пересечение периодов
41 сообщений из 41, показаны все 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
Пересечение периодов
    #39766403
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKferzmikk,
Код: sql
1.
2.
discount_begin <= @discount_end AND
discount_end >= @discount_begin


Работает же. Нужные варианты отбирает (1,2,3,4) и не нужные не отбирает (5,6). Или это условие что то не учитывает?
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766406
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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

Все таки это математика. Давайте тогда уж разберем этот логический нюанс.
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766527
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот единственно правильное решение, все остальное в помойку.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
--- при этом предпологается что (@D1 <= @D2 ) и t.DT1 <= t.DT2
--- D1 и D2 - границы периода отчета
--- DT1 и DT2 - границы периода жизни чего либо
select t.*
from test_table t with(nolock) -- таблица с 
where
		IsNULL(t.DT1, '1900-01-01') <= IsNULL(@D2, '3000-01-01')
and		IsNULL(t.DT2, '3000-01-01') >= IsNULL(@D1, '1900-01-01')
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766529
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaffarВот единственно правильное решение, все остальное в помойку.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
--- при этом предпологается что (@D1 <= @D2 ) и t.DT1 <= t.DT2
--- D1 и D2 - границы периода отчета
--- DT1 и DT2 - границы периода жизни чего либо
select t.*
from test_table t with(nolock) -- таблица с 
where
		IsNULL(t.DT1, '1900-01-01') <= IsNULL(@D2, '3000-01-01')
and		IsNULL(t.DT2, '3000-01-01') >= IsNULL(@D1, '1900-01-01')


Мой герой!
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766535
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaffarВот единственно правильное решениеГениально!
Индексы - в топку!
nolock - наше все!
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766538
tashkafox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
От обратного: отбираем тех, которые не входят в период (это проще):
- те, кто закончился до начала периода
- и те, кто начался после конца периода
И добавляем логическое НЕ.
Код: sql
1.
not(discount_begin > @discount_end or discount_end < @discount_begin)


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

Учись студент, а то будешь всю жизнь ключи подавать...
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766548
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tashkafoxferzmikk,
От обратного: отбираем тех, которые не входят в период (это проще):
- те, кто закончился до начала периода
- и те, кто начался после конца периода
И добавляем логическое НЕ.
Код: sql
1.
not(discount_begin > @discount_end or discount_end < @discount_begin)


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

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

кэп, ну если нужные поля(DT1 и DT2 ) not NULL - тогда можно и убрать перестраховку,
а если нет - то терпите,
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766559
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jaffarкэп, ну если нужные поля(DT1 и DT2 ) not NULL - тогда можно и убрать перестраховку,Тогда это таки не единственно правильное решение?
Jaffarа если нет - то терпите,А если нет - то надо мозги включать...
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766567
Jaffar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Кто бы говорил...
2 дня обсуждать то что не стоит выеденного яйца.
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766571
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jaffar2 дня обсуждать то что не стоит выеденного яйца.Вот именно.
И тут пришел гениальный Jaffar и выдал эпическую чушь. Впрочем, как обычно...
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766649
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой же сухой осадок-то остался?
Так что ли нужно?
Код: sql
1.
2.
3.
(d1 IS NULL OR @d2 IS NULL OR d1<=@d2)
AND
(d2 IS NULL OR @d1 IS NULL OR d2>=@d1)

Если придерживаться обозначений Jaffar 21796827
Исхожу из предположения, что для d1 и @d1 IS NULL - это "минус бесконечность", а для d2 и @d2 IS NULL - это "плюс бесконечность".

Я же так и не дождался ответа на вопрос "как интерпретируются NULLы"...
...
Рейтинг: 0 / 0
Пересечение периодов
    #39766670
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapferzmikkесли в полях [discount_begin] и/или [discount_end] присутствуют NULLИ как же интерпретируются NULLы?Это маловероятный случай, вдруг по каким то причинам заведено новое промо и не выбрана [discount_begin] и/или [discount_end]. Хотя в системе есть проверка перед записью. Но все равно актуально написать запрос так - вдруг NULL.
...
Рейтинг: 0 / 0
41 сообщений из 41, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пересечение периодов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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