Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Microsoft Office и VBA > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 22.03.2019, 14:09   #1
НиколайТретий
Новичок
Джуниор
 
Регистрация: 22.03.2019
Сообщений: 8
Репутация: 10
По умолчанию Посчитать поля с пересекающимися отрезками

Добрый день!
Подскажите, пожалуйста по созданию запроса:
Имеются три поля.
Первое - имя клиента.
Второе - дата и время его прихода в формате 29.03.2019 12:00:00 (полный формат даты).
Третье - время обработки данного клиента (в часах) в формате 14:00
Таким образом, имеем отрезок времени для этого клиента
от 29.03.2019 12:00:00 до 30.03.2019 14:00.
И так по всем клиентам, которых может быть больше или меньше, но порядка нескольких тысяч.
Нужно выявить клиентов, которые встретятся на обработке. То есть, их отрезки пересекутся.
Возился с Count, но условие between с расчетами из разных полей записи не принимает. Where вообще работает с одной строкой. Iif вложить в Count тоже не получилось.
Наверное, опыта маловато.
НиколайТретий вне форума   Ответить с цитированием
Старый 22.03.2019, 14:57   #2
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,917
Репутация: 2242
По умолчанию

Код:
select t1.Id, t2.ID 
from (t as t1), (t as t2) --это  будут ВСЕ пары клиентов посещений
where -- а теперь начнем отбирать
  t1.ID <> t2.ID -- для начала разные клиенты
and 
  t1.dt[приход] <t2.dt[приход] --пришел раньше
and
  t1.dt[приход] +t1.rabota {т.е. время ухода} > t2.dt[приход] --не ушел ДО прихода
сколько будет работать такой запрос не представляю, но приготовьтесь к долгому ожиданию.
__________________
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.03.2019 в 15:00.
evg_m вне форума   Ответить с цитированием
Старый 22.03.2019, 15:05   #3
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,878
Репутация: 5617
По умолчанию

там нужно написать через "ИЛИ" три варианта из 4-х имеющихся (трёх достаточно, ибо 4-й попадает в один из 3-х)
вот такие варианты могут быть:
Название: TimeIntersect.png
Просмотров: 78

Размер: 36.2 Кб
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 22.03.2019, 15:38   #4
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,921
Репутация: 6688
По умолчанию

есть 2 отрезка: A1<A2 и B1<B2
они пересекаются если: B1<A2 and B2>A1
это учтет все варианты
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 22.03.2019, 15:56   #5
НиколайТретий
Новичок
Джуниор
 
Регистрация: 22.03.2019
Сообщений: 8
Репутация: 10
По умолчанию

Через два условия > и < тоже пытался. Не срабатывает. Может быть, потому, что сравнение идет не с конкретной датой/временем, а с вычисляемой величиной, например, "Дата/время прихода + время обработки". А может быть, из-за того, что нужно каждую запись рассчитывать с учетом отрезков ВСЕХ полей в сопоставлении со своим?
НиколайТретий вне форума   Ответить с цитированием
Старый 22.03.2019, 16:00   #6
НиколайТретий
Новичок
Джуниор
 
Регистрация: 22.03.2019
Сообщений: 8
Репутация: 10
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
select t1.Id, t2.ID 
from (t as t1), (t as t2) --это  будут ВСЕ пары клиентов посещений
where -- а теперь начнем отбирать
  t1.ID <> t2.ID -- для начала разные клиенты
and 
  t1.dt[приход] <t2.dt[приход] --пришел раньше
and
  t1.dt[приход] +t1.rabota {т.е. время ухода} > t2.dt[приход] --не ушел ДО прихода
сколько будет работать такой запрос не представляю, но приготовьтесь к долгому ожиданию.
Спасибо. Попробую. Считать будет долго, согласен. База большая.
НиколайТретий вне форума   Ответить с цитированием
Старый 22.03.2019, 16:01   #7
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,921
Репутация: 6688
По умолчанию

Сначала правильно из даты-времени начала и времени конца получи правильно дату-время конца. Остальное потом )
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар на форуме   Ответить с цитированием
Старый 22.03.2019, 16:12   #8
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,878
Репутация: 5617
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
есть 2 отрезка: A1<A2 и B1<B2
они пересекаются если: B1<A2 and B2>A1
это учтет все варианты
да. верно. круто!
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 22.03.2019, 16:32   #9
НиколайТретий
Новичок
Джуниор
 
Регистрация: 22.03.2019
Сообщений: 8
Репутация: 10
По умолчанию

Если покороче записать, то нужно для каждого поля (назовем ti) проверить условие:
ti>tj-t'i & ti<tj+t'j для всех j. И найти количество удовлетворяющих условия случаев, перебрав все tj.
Здесь t' - время обработки, соответственно, проверяемого поля i или сопоставляемого с ним поля j. По очереди нужно проверить все поля ti записи. tj - текущее сопоставляемое поле.
Если так будет проще, то можно сделать отдельные записи для ti и для tj.
НиколайТретий вне форума   Ответить с цитированием
Старый 22.03.2019, 16:35   #10
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 25,878
Репутация: 5617
По умолчанию

Цитата:
Сообщение от НиколайТретий Посмотреть сообщение
Если покороче записать, то нужно для каждого поля (назовем ti) проверить условие:
никаких циклов. мыслите в парадигме SQL.

и начните с
Цитата:
Сообщение от Аватар Посмотреть сообщение
Сначала правильно из даты-времени начала и времени конца получи правильно дату-время конца. Остальное потом )
Serge_Bliznykov вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение области на изображении непрерывными отрезками Marsel737 Общие вопросы Delphi 5 21.04.2010 23:46
как получить значение поля грид на основе значения другого lookUp поля malayka БД в Delphi 0 21.04.2010 19:06
Выявление одинаковости значений поля в одной талице по значению поля в другой nikmay SQL, базы данных 4 13.08.2009 12:51
Найти координаты хотя бы одной точки, попадающей в область, образованную тремя пересекающимися линиями. Zibiv Помощь студентам 1 03.10.2008 17:55


18:44.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.