Страница 1 из 1

запись к врачу

Добавлено: 11 дек 2017, 16:54
ЕвгенийЧерепанов
нужно разработать календарь записи к врачу, время процедуры может быть разным.
на сайте нужно выводить свободные интервалы
как проще сделать базу? можно ли выводить не занятые ячейки.
структура таблицы:
id
time_begin
time_end
id_clients

не могу понять
в sql нужно на следующий день заполнить предварительно с минимальным интервалом, например по 5 минут
т.е. 8:00 - 8:05
8:05-8:10 и т.д. до 24:00

или можно выводить незаполненные ???

Re: запись к врачу

Добавлено: 11 дек 2017, 17:21
Absurd
ЕвгенийЧерепанов писал(а):нужно разработать календарь записи к врачу, время процедуры может быть разным.
на сайте нужно выводить свободные интервалы
как проще сделать базу? можно ли выводить не занятые ячейки.
структура таблицы:
id
time_begin
time_end
id_clients

не могу понять
в sql нужно на следующий день заполнить предварительно с минимальным интервалом, например по 5 минут
т.е. 8:00 - 8:05
8:05-8:10 и т.д. до 24:00

или можно выводить незаполненные ???
В запросе свалить все time_begin и time_end в одну колонку (UNION ALL) и отсортировать. Очевидно что нечетные записи будут началом очередного интервала, а четные - концом этого интервала. Все что между интервалами - свободное время. Надо будет еще констрейнты какие-то ввести чтобы они не перекрывались и чтобы time_begin был всегда меньше time_end.

Re: запись к врачу

Добавлено: 11 дек 2017, 17:29
ЕвгенийЧерепанов
Absurd писал(а):В запросе свалить все time_begin и time_end в одну колонку (UNION ALL) и отсортировать. Очевидно что нечетные записи будут началом очередного интервала, а четные - концом этого интервала. Все что между интервалами - свободное время. Надо будет еще констрейнты какие-то ввести чтобы они не перекрывались и чтобы time_begin был всегда меньше time_end.

Спасибо за ответ.

я единственное не пойму тогда
нужно сначала автозаполнять интервалы на день (то есть на день делать как то множественной вставкой) потому что для клиента нужно выводить временные промежутки на которые он может сам записаться

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

Re: запись к врачу

Добавлено: 11 дек 2017, 17:48
Absurd
ЕвгенийЧерепанов писал(а):Спасибо за ответ.

я единственное не пойму тогда
нужно сначала автозаполнять интервалы на день (то есть на день делать как то множественной вставкой) потому что для клиента нужно выводить временные промежутки на которые он может сам записаться

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

Не понимаю зачем вам заполнять чего-то. Допустим, временные окна для приема в день - по 5 минут.

Код: Выделить всё

table time_window(id: autoincrement, begin_time, end_time)
insert into time_window(begin_time, end_time) values(8:00, 8:05) ... insert into time_window(begin_time, end_time) values(15:55, 16:00)

table appointment(id: autoincrement, date, time_window_id: foreign key, patient_id: foreign key)

select * from time_window where not exists(select 1 from appointment where time_window.id = appointment.time_window_id and appointment.date = :p aram_date)
Не уверен что код правильный, но я уверен что вы сами разберетесь как работает exists/not exists

Re: запись к врачу

Добавлено: 11 дек 2017, 21:33
ЕвгенийЧерепанов

Код: Выделить всё

Не понимаю зачем вам заполнять чего-то. Допустим, временные окна для приема в день - по 5 минут. 
если бы...
проблема в том что обследования разные по времени, одни по 20 минут, другие 30, есть по 45 и 60, и даже 80 минут. задача в том чтобы клиенту предлагать время не занятое. Я вот и думал сделать по 5 минут.
Если обследование занимает 20 то 4 записи в базе делать с каким либо номером, который приводит на список услуг по данному клиенту

Re: запись к врачу

Добавлено: 11 дек 2017, 21:50
Absurd
ЕвгенийЧерепанов писал(а):

Код: Выделить всё

Не понимаю зачем вам заполнять чего-то. Допустим, временные окна для приема в день - по 5 минут. 
если бы...
проблема в том что обследования разные по времени, одни по 20 минут, другие 30, есть по 45 и 60, и даже 80 минут. задача в том чтобы клиенту предлагать время не занятое. Я вот и думал сделать по 5 минут.
Если обследование занимает 20 то 4 записи в базе делать с каким либо номером, который приводит на список услуг по данному клиенту
Ну тогда нужно сделать дополнительную таблицу "обследование", которая аггрегирует от одного до n последовательных таймфреймов по пять минут через промежуточную таблицу. Свободные окна времени вытаскиваются примерно так же через NOT EXISTS(). Я думаю последовательные пустые таймфреймы можно даже склеить средствами самого SQL через хитрый GROUP BY.

Код: Выделить всё

appointment(id, date, patient_id)-1..n->appontment_timeframe(appointment_id, timeframe_id /* composite primary key */) <-Inf..1 timeframe(id, 8:00-8:05...15:55-16:00 /*fixed size table*/)

Re: запись к врачу

Добавлено: 11 дек 2017, 22:05
Absurd
ЕвгенийЧерепанов писал(а):

Код: Выделить всё

Не понимаю зачем вам заполнять чего-то. Допустим, временные окна для приема в день - по 5 минут. 
если бы...
проблема в том что обследования разные по времени, одни по 20 минут, другие 30, есть по 45 и 60, и даже 80 минут. задача в том чтобы клиенту предлагать время не занятое. Я вот и думал сделать по 5 минут.
Если обследование занимает 20 то 4 записи в базе делать с каким либо номером, который приводит на список услуг по данному клиенту
ну да, все так и делают.

Код: Выделить всё

appointment(id, date, patient_id)-1..n->appontment_timeframe(appointment_id, timeframe 1 ... 96 /* 8:00 - 15:55 */)
Для таблицы appontment_timeframe лучше указать композитный primary key из обоих колонок. Для Оракла также пометить как index organized table. Свободное время можно получить через NOT EXISTS() запрос, как я писал ранее.

Re: запись к врачу

Добавлено: 11 дек 2017, 22:12
Absurd
ЕвгенийЧерепанов писал(а):

Код: Выделить всё

Не понимаю зачем вам заполнять чего-то. Допустим, временные окна для приема в день - по 5 минут. 
если бы...
проблема в том что обследования разные по времени, одни по 20 минут, другие 30, есть по 45 и 60, и даже 80 минут. задача в том чтобы клиенту предлагать время не занятое. Я вот и думал сделать по 5 минут.
Если обследование занимает 20 то 4 записи в базе делать с каким либо номером, который приводит на список услуг по данному клиенту
Ну тогда нужно сделать дополнительную таблицу "обследование", которая аггрегирует от одного до n последовательных таймфреймов по пять минут через промежуточную таблицу.

Код: Выделить всё

appointment(id, date, patient_id)-1..n->appontment_timeframe(appointment_id, timeframe_id /* composite primary key */) <-1..Inf timeframe(id, 8:00-8:05...15:55-16:00 /*fixed size table*/)

Re: запись к врачу

Добавлено: 13 дек 2017, 21:38
ЕвгенийЧерепанов
а как тогда я буду пользователю выводить информацию?
у него должны быть кнопки из свободного времени. количество кнопок определяется продолжительностью обследования.

приведу пример,
Иванов Иван хочет записаться на обследование 1 (продолжительность 20 минут)
Петров Петр хочет записаться на обследование 2 (продолжительность 45 минут)
Сидоров Виктор хочет записаться на обследование 3 (продолжительность 30 минут)

так вот

когда клиент выбирает обследование, то ему нужно показывать свободные интервалы (для каждого клиента они свои), ведь если у нас есть в БД записи например такие:

08:00 - 08:20,
08:20 - 08:40,
09:00 - 09:45,
09:50 - 10:10,
12:00 - 12:30,
12:30 - 13:15
14:00 - 14:20

то для первого клиента доступны должны быть окошки в виде кнопок:

08:40 - 09:00
10:10 - 10:30
10:30 - 10:50
10:50 - 11:10
11:10 - 11:30
11:30 - 11:50
13:15 - 13:35
13:35 - 13:55

для второго:
10:10 - 10:55
10:55 - 11:40
13:15 - 14:00

для третьего:
10:10 - 10:40
10:40 - 11:10
11:10 - 11:40
13:15 - 13:45

я почему то не могу понять как при вашем способе это реализовать.

вероятно не хватает опыта с СУБД...

Re: запись к врачу

Добавлено: 13 дек 2017, 23:15
Absurd
ЕвгенийЧерепанов писал(а):а как тогда я буду пользователю выводить информацию?
я почему то не могу понять как при вашем способе это реализовать.

вероятно не хватает опыта с СУБД...

Проще по моему сделать это хранимой процедурой через одну или две временные таблицы. В одну выфечить все занятые интервалы, в другую - все не занятые. Потом заджоинить их друг на друга и сгруппировать по максимальному времени незанятого таймфрейма, который меньше занятого. Либо просто пройтись циклом по курсору и склеить смежные интервалы. Можно и программой их склеить если у вас какой-нибудь кастрированный MySQL и нет хранимых процедур. Единым запросом я бы заморачивался это сделать разве что только в Оракле при помощи ключевого слова OVER.