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

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
ЕвгенийЧерепанов
Сообщения: 4
Зарегистрирован: 11 дек 2017, 16:26

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

Сообщение ЕвгенийЧерепанов » 11 дек 2017, 16:54

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

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

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

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

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

Сообщение Absurd » 11 дек 2017, 17:21

ЕвгенийЧерепанов писал(а):нужно разработать календарь записи к врачу, время процедуры может быть разным.
на сайте нужно выводить свободные интервалы
как проще сделать базу? можно ли выводить не занятые ячейки.
структура таблицы:
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.
2B OR NOT(2B) = FF

ЕвгенийЧерепанов
Сообщения: 4
Зарегистрирован: 11 дек 2017, 16:26

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

Сообщение ЕвгенийЧерепанов » 11 дек 2017, 17:29

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

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

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

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

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

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

Сообщение Absurd » 11 дек 2017, 17:48

ЕвгенийЧерепанов писал(а):Спасибо за ответ.

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

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

Не понимаю зачем вам заполнять чего-то. Допустим, временные окна для приема в день - по 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
2B OR NOT(2B) = FF

ЕвгенийЧерепанов
Сообщения: 4
Зарегистрирован: 11 дек 2017, 16:26

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

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

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

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

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

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

Сообщение Absurd » 11 дек 2017, 21:50

ЕвгенийЧерепанов писал(а):

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

Не понимаю зачем вам заполнять чего-то. Допустим, временные окна для приема в день - по 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*/)
2B OR NOT(2B) = FF

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

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

Сообщение Absurd » 11 дек 2017, 22:05

ЕвгенийЧерепанов писал(а):

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

Не понимаю зачем вам заполнять чего-то. Допустим, временные окна для приема в день - по 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() запрос, как я писал ранее.
2B OR NOT(2B) = FF

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

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

Сообщение Absurd » 11 дек 2017, 22:12

ЕвгенийЧерепанов писал(а):

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

Не понимаю зачем вам заполнять чего-то. Допустим, временные окна для приема в день - по 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*/)
2B OR NOT(2B) = FF

ЕвгенийЧерепанов
Сообщения: 4
Зарегистрирован: 11 дек 2017, 16:26

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

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

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

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

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

Сообщение Absurd » 13 дек 2017, 23:15

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

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

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

Ответить