Способ хранения часов работы, чтобы определить, открыто ли место сейчас - PullRequest
0 голосов
/ 26 августа 2018

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

Вотпример часов работы ресторана:

Monday: 6:00AM-10:00PM
Tuesday: 6:00AM-10:00PM
Wednesday: 6:00AM-10:00PM
Thursday: 6:00AM-10:00PM
Friday: 6:00AM-11:59PM
Saturday: 0:00AM-3:00AM, 6:00AM-11:59PM
Sunday: 0:00AM-3:00AM, 6:00AM-10:00PM

Я не уверен, какой тип схемы мне следует использовать, чтобы представить это, таким образом, чтобы я мог определить, является ли конкретный рестораноткройте сейчас.

Когда я настрою схему, моя цель - определить следующее для любого конкретного ресторана:

  • Является ли ресторанбудет открыт через 15 минут
  • Будет ли ресторан закрыт через 45 минут

Таким образом, если текущее время составляет 15 минут до открытия ресторана, ресторан должен быть рассмотреноткрыт, и если текущее время составляет 45 минут до закрытия, ресторан следует считать закрытым, а все, что между этим следует считать открытым, принимая во вниманиеопрокидывание счета в полночь.

Итак, вот некоторые ожидаемые данные и результаты:

Restaurant 1
Monday: 6:00AM-10:00PM
Tuesday: 6:00AM-10:00PM
Wednesday: 6:00AM-10:00PM
Thursday: 6:00AM-10:00PM
Friday: 6:00AM-11:59PM
Saturday: 0:00AM-3:00AM, 6:00AM-11:59PM
Sunday: 0:00AM-3:00AM, 6:00AM-10:00PM

Current day/time -> Result
Monday 12:00PM -> Open
Monday 2:00AM -> Closed
Monday 5:45AM -> Open
Monday 9:30PM -> Closed
Saturday 4:00AM -> Closed
Saturday 11:55PM -> Open
Sunday 2:00AM -> Open
Sunday 2:25AM -> Closed

Я не уверен, как бы я справился со временем опрокидывания, дляпример, чтобы определить, будет ли ресторан открыт через 45 минут в субботу в 23:55.

Вот еще один пример часов работы ресторана:

Monday: 10:00AM-10:00PM
Tuesday: 10:00AM-10:00PM
Wednesday: 10:00AM-10:00PM
Thursday: 10:00AM-10:00PM
Friday: 10:00AM-11:59PM
Saturday: 0:00AM-11:59PM
Sunday: 0:00AM-9:00PM

В субботу магазин работает в течение 24 часов, поэтому мне нужно иметь дело и с этим делом.

Ресторан может быть открыт 24/7:

Monday: 0:00AM-11:59PM
Tuesday: 0:00AM-11:59PM
Wednesday: 0:00AM-11:59PM
Thursday: 0:00AM-11:59PM
Friday: 0:00AM-11:59PM
Saturday: 0:00AM-11:59PM
Sunday: 0:00AM-11:59PM

В ресторане может быть 0, 1, 2 или более периодов в день:

Monday: CLOSED
Tuesday: CLOSED
Wednesday: 10:00AM-2:00PM, 5:00PM-10:00PM
Thursday: 10:00AM-2:00PM, 5:00PM-10:00PM
Friday: 10:00AM-2:00PM, 5:00PM-11:59PM
Saturday: 0:00AM-3:00AM, 10:00AM-2:00PM, 5:00PM-11:59PM
Sunday: 0:00AM-3:00AM, 10:00AM-2:00PM, 5:00PM-9:00PM

Поэтому моя цель - найти для данного ресторана и егочасы работы, независимо от того, находится ли текущее время между:

  • 15 минут до открытия и
  • 45 минут до закрытия,
  • за любой период на этомдень

И найти хороший способ хранения информации, чтобы можно было определить, что, для нескольких ресторанов.

Поскольку в день может быть 0 или несколько периодов, я думаю, что имеет смысл хранить 1 период в строке, но кроме этого я не уверен, как это сделать.

1 Ответ

0 голосов
/ 26 августа 2018

Я думаю, у меня может возникнуть желание сохранить его таким образом:

bit_code opens    closes
69       06:00:00 22:00:00 
48       06:00:00 03:00:00

Я численно изобразил дни недели следующим образом:

Monday    -  1
Tuesday   -  2
Wednesday -  4
Thursday  -  8
Friday    - 16
Saturday  - 32
Sunday    - 64

Итак, пятница+ Суббота = 48

РЕДАКТИРОВАТЬ:

Рассмотрим следующий пример:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(weekday_code INT NOT NULL
,opens TIME NOT NULL
,closes TIME NOT NULL
);

INSERT INTO my_table VALUES
(69,'06:00:00','22:00:00'),
(48,'06:00:00','03:00:00');

Это 23:30:00.Я думаю, что следующее скажет нам, в какие дни недели ресторан в настоящее время открыт (и учитывая правила 15-минут и 45-минут) ...

SELECT *  
  FROM my_table 
 WHERE CAST('23:30:00' AS TIME) >= opens - INTERVAL 15 MINUTE
   AND CAST('23:30:00' AS TIME) <= (CASE WHEN closes < opens THEN closes + INTERVAL 24 HOUR ELSE closes END) - INTERVAL 45 MINUTE; 

+--------------+----------+----------+
| weekday_code | opens    | closes   |
+--------------+----------+----------+
|           48 | 06:00:00 | 03:00:00 |
+--------------+----------+----------+ 

Мы можем ввести другие приемы - либо вкод приложения или SQL - для расшифровки, к каким дням недели относится «48».Точно так же мы не должны хранить дни недели таким образом;это только кажется довольно компактным, особенно если есть много ресторанов (с довольно последовательными часами работы).

В любом случае, если принять этот подход ... и просто для забавы / полноты ...

SELECT a.x 
FROM 
   ( SELECT  1 x UNION
     SELECT  2 UNION
     SELECT  4 UNION
     SELECT  8 UNION
     SELECT 16 UNION
     SELECT 32 UNION
     SELECT 64 
   ) a
JOIN my_table b
  ON a.x = ( a.x & b.weekday_code) 
 AND CAST('23:30:00' AS TIME) >= b.opens - INTERVAL 15 MINUTE
 AND CAST('23:30:00' AS TIME) <= (CASE WHEN b.closes < b.opens THEN b.closes + INTERVAL 24 HOUR ELSE b.closes END) - INTERVAL 45 MINUTE; 

 +----+
 | x  |
 +----+
 | 16 |
 | 32 |
 +----+

Из этого можно сделать вывод, что если сегодня пятница или суббота, то ресторан

Обратите внимание, что может быть более элегантный способ выразить это в SQL - или может быть разумнее обрабатывать декодирование битов в коде приложения,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...