powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Выборка нескольких пересечений периодов в течение года
16 сообщений из 16, страница 1 из 1
Выборка нескольких пересечений периодов в течение года
    #39766547
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, приветствую.

Проблема несколькими словами...
Есть таблица календаря работы человека. Всего 360 дней на человека с несколькими вахтами работы, длящиеся приблизительно дней 40.
Есть определенные маркеры начала и конца вахт (Пр и От)

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

Это скрин формы на перекрестном запросе.
В таблице поля
Id, Работник, Дата, Значение
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766563
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан,

Я делал на промежуточных запросах выделения начала и конца вахт
00tetsPr - начало вахты
00tetsOt - конец вахты

Код: sql
1.
2.
3.
4.
5.
INSERT INTO 00tetsPrTemp ( Id, Worker, DateFrom, DateTo, CurMonth, CurYear )
SELECT [00tetsPr].Id, [00tetsPr].Worker, [00tetsPr].DatePr AS DateFrom, 
(SELECT TOP 1 DateOT FROM [00tetsOt] where [00tetsOt].Worker=[00tetsPr].Worker and DateOT>=DatePr order by DateOT) AS DateTo, 
[00tetsPr].CurMonth, [00tetsPr].CurYear
FROM 00tetsPr;


Но с вложенным запросом работает медленно....т.к. просчет и вывод конечного результата на лету,
скорость не устраивает.
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766564
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я один не вижу работника в перекрестном запросе?
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766566
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан, наверное, было понятнее со структурой таблиц.
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766568
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Выбор сотрудника выше. Это просто скрин (обрезанный) формы календаря работы сотрудников
Вопрос не к конкретном сотруднике
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766576
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сперва надо выбросить перекрёстный запрос. Для работы нужна плоская таблица (Дата-Маркер).
Первым делом двумя подзапросами выбираются начала и концы вахт. Затем они связываются по условию Начала.Дата < Концы.Дата. После этого группируются по Начала.Дата, и берётся MIN(Концы.Дата). Всё, у тебя в руках периоды вахт.
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766581
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. если есть таблица

Код: vbnet
1.
CREATE TABLE table (dDate, tStatus)



то

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT starts.dDate vStart, MIN(ends.dDate) vEnd
FROM ( SELECT dDate
       FROM table
       WHERE tStatus = 'Пр' ) starts,
     ( SELECT dDate
       FROM table
       WHERE tStatus = 'От' ) ends
WHERE starts.dDate < ends.dDate
GROUP BY starts.dDate



Есссно в набор попадут только полные вахты. Если есть вахта, переходящая границу года - можно в подзапросы добавить виртуальные записи за 1 января и 31 декабря (UNION).
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766592
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,


Прошу прощения, вот пример бд

00tetsPr- определение начала вахты
00tetsOt - определение конца вахты
01testOtPr - собирал их в один.
02CalendarWorkerYes - сохраняю график рабочих дней в таблицу.
Это старая версия, в ней есть минусы, из за нее и начал переделывать.
Просто там дальше я ищу пересечение этих данных с другими

01testOtPr_ - новая попытка вытягивать период, вот сейчас выполнение запроса тянет на сек 30-35
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766593
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан,
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766594
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан,
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766596
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан,

Не поместилось в одном...
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766602
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaСперва надо выбросить перекрёстный запрос. Для работы нужна плоская таблица (Дата-Маркер).
Она и есть - CalendarWork

AkinaПервым делом двумя подзапросами выбираются начала и концы вахт. Затем они связываются по условию Начала.Дата < Концы.Дата. После этого группируются по Начала.Дата, и берётся MIN(Концы.Дата). Всё, у тебя в руках периоды вахт.
У меня так и реализовано сейчас, только не вложенными, но медленно работает...
и еще условие, что не обязательно первой в году будет дата начала вахты. Вахта может заканчиваться с прошлого года.

Вообще суть вот в чем.
Есть вахты сотрудников, и есть периоды возможности проверок ТБ, например, работников.
Нужно найти в этих 2 таблицах (вахт и проверок) даты пересечения, что бы назначить дни прохождения проверок.
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766620
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT starts.dDate vStart, MIN(ends.dDate) vEnd
FROM ( SELECT dDate
       FROM table
       WHERE tStatus = 'Пр' ) starts,
     ( SELECT dDate
       FROM table
       WHERE tStatus = 'От' ) ends
WHERE starts.dDate < ends.dDate
GROUP BY starts.dDate



Спасибо!
Переделал запрос по вашему образцу, летает.

Код: sql
1.
2.
3.
4.
5.
INSERT INTO 00tetsPrTemp ( Worker, DateFrom, DateTo )
SELECT [00tetsPr].Worker, DatePr, Min(DateOT) AS [Min-DateOT]
FROM 00tetsOt INNER JOIN 00tetsPr ON [00tetsOt].Worker = [00tetsPr].Worker
WHERE (((DateOT)>[DatePr]))
GROUP BY [00tetsPr].Worker, DatePr;
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766673
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан,

на одного из работников задвоен весь месяц--это у вас допустимо
WorkergmdValueCal73875120187111738751201871127387512018721173875120187212738751201873117387512018731273875120187411738751201874127387512018751173875120187512738751201876117387512018761273875120187711738751201877От73875120187811738751201878В738751201879В738751201879От
...
Рейтинг: 0 / 0
Выборка нескольких пересечений периодов в течение года
    #39766806
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА,

Спасибо, проверю, от куда это.
Но задвоения, в любом случае, не должно быть.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Выборка нескольких пересечений периодов в течение года
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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