Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Znajdowanie wolnych bloków czasu w mysql i php?

Wypróbuj to zapytanie

SELECT
  a.id,
  a.start_hour,
  a.end_hour,
  TIMEDIFF(la.start_hour, a.end_hour) as `Free Time`
FROM appointment as a
  LEFT JOIN(SELECT * FROM appointment LIMIT 1,18446744073709551615) AS la
    ON la.id = a.id + 1
  LEFT JOIN (SELECT * FROM appointment) AS ra ON a.id = ra.id

Spowoduje to wyświetlenie tych wyników

+---------------------------------------------+
¦ id ¦ start_hour BY ¦ end_hour   | Free Time |
¦----+---------------¦------------------------|
¦  1 ¦   08:00:00    ¦  08:15:00  | 05:45:00  |
¦  2 ¦   14:00:00    ¦  14:30:00  | 02:30:00  |
¦  3 ¦   17:00:00    ¦  17:45:00  | 03:15:00  |
¦  4 ¦   21:00:00    ¦  21:00:00  | (NULL)    |
+--------------------+------------------------+ 

Musisz także mieć 21:00:00 w tabeli, inaczej nie będziesz w stanie uzyskać ostatniej różnicy czasu. wpisałem 21:00:00 jako datę rozpoczęcia i zakończenia w tabeli.

EDYTOWANO

To jest zmodyfikowane zapytanie

SELECT
  a.id,
  a.end_hour AS `Free time Start`,
  IFNULL(la.start_hour,a.end_hour) AS `Free Time End`,
  IFNULL(TIMEDIFF(la.start_hour, a.end_hour),'00:00:00') AS `Total Free Time`
FROM appointment AS a
  LEFT JOIN (SELECT * FROM appointment LIMIT 1,18446744073709551615) AS la
    ON la.id = (SELECT MIN(id) FROM appointment where id > a.id LIMIT 1)      

Rezultatem jest

+--------------------------------------------------------+
¦ id ¦ Free time Start ¦ Free Time End | Total Free Time |
¦----+-----------------¦---------------------------------|
¦  1 ¦   08:15:00      ¦ 14:00:00      |    05:45:00     |
¦  2 ¦   14:30:00      ¦ 17:00:00      |    02:30:00     |
¦  3 ¦   17:45:00      ¦ 21:00:00      |    03:15:00     |
¦  4 ¦   21:00:00      ¦ 21:00:00      |    00:00:00     |
+----------------------+---------------------------------+  

Punkty do nauczenia się z tego zapytania to

  1. Wykorzystanie funkcji Timediff. timediff('czas zakończenia','czas rozpoczęcia')
  2. Łączenie z górnym numerem
  3. Unikaj pierwszego rekordu w złączeniu z długim przesunięciem i limitem zaczynającym się od 1 zamiast zera
  4. Użycie IFNULL ifnull('jeśli tutaj jest null','wybierz to')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak używać polubienia z sprzężeniem w sql?

  2. Spring Boot:Jdbc javax.net.ssl.SSLException:zamykanie ruchu przychodzącego przed otrzymaniem close_notify od peera

  3. Określanie, czy indeks tabeli MySQL istnieje przed utworzeniem

  4. Java Spring REST API obsługuje wiele opcjonalnych parametrów

  5. wielokrotne zapytania mysql w jednym oświadczeniu