• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mysql - znajdowanie wolnego terminu

+2 głosów
59 wizyt
pytanie zadane 5 dni temu w SQL, bazy danych przez Piotr Popławski Użytkownik (530 p.)

W tablicy mam cztery kolumny: ID, IDM, OD, DO

Przykład danych:

jak skonstruować zapytanie do tej tablicy by znaleźć pierwszy wolny termin od dziś?

W tym przypadku jest to 22-05-2022

Dziękuję za podpowiedź

3 odpowiedzi

0 głosów
odpowiedź 5 dni temu przez Wiciorny Ekspert (218,990 p.)

Pierwszy wolny termin od dziś:
To będzie ostatni dzień po MAKSYMALNYM DNIU W KOLUMNIE DO. Na tej podstawie sformułuj zapytanie z odpowiednim warunkiem zwracając  albo : 

  •  zwróć NAJWYŻSZĄ DATĘ Z WARTOŚCIĄ  kolumny DO ( jeśli mowa o wszystkich terminach ) i dodaj do niej +1 dzień- wtedy masz pierwszy wolny.
  • - zwróć rekord w którym zwrócisz kolumnę do - i dodaj do niej 1 dzień, wtedy dla danego rekordu masz dzień następny wolny. 

 

komentarz 5 dni temu przez Piotr Popławski Użytkownik (530 p.)
edycja 5 dni temu przez Piotr Popławski

Dzięki, jednak w tym przypadku nie zadziała :(

dlatego, że maksymalna data do to 24-07-2022, między datami jest wolny termin, który jest od 22-05-2022 do 17-07-2022

SELECT id, m_id, od, do, 
 DATE_ADD(max(do), INTERVAL 1 DAY),
 MAX(do) 
FROM dane

 

komentarz 5 dni temu przez Wiciorny Ekspert (218,990 p.)
ja przedstawiam tylko prosty algorytm, a nie implementacje. Ja zrozumialem, że rezerwacja jest na termin OD-DO. generalnie w takim razie to podlega modyfikacji :
- znajdujesz termin który jednocześnie jeśli jest największym terminem po lewej stronie, to nie moze istnieć po prawej jednocześnie ( wiekszy o jeden). Czyli jest to  pierwszy wolny element którego wartość DO +1 nie istnieje w partości OD. :)
0 głosów
odpowiedź 5 dni temu przez Piotr Popławski Użytkownik (530 p.)

nie wiem czy nie przekombinowałem, ale działa.

SELECT
  a.id,a.m_id,
  
  DATE_ADD(a.do, INTERVAL 1 DAY) AS `Wolny od`,
  IFNULL(la.od,a.do) AS `Zajęty od`,
  IFNULL(dateDIFF(la.od, DATE_ADD(a.do, INTERVAL 1 DAY)),'00:00:00') AS wolny,
  la.od as wieksze
  
FROM wypozycz AS a
  LEFT JOIN (SELECT * FROM wypozycz LIMIT 1,18446744073709551615) AS la
    ON la.id = (SELECT MIN(id) FROM wypozycz where id > a.id LIMIT 1)
    
    WHERE IFNULL(dateDIFF(la.od, DATE_ADD(a.do, INTERVAL 1 DAY)),'00:00:00')

Efektem tego jest :)

 

0 głosów
odpowiedź 4 dni temu przez areklipno Stary wyjadacz (10,510 p.)

Nie znam dobrze mysql więc zapytania dokładnie nie podam bo nie znam odpowiednika generate_series z postgresa. Ale w skrócie wyglądałoby to tak, że:

- generuje sobie w cte zestaw dat od np 2022-05-13 do 2022-12-31

- w drugim cte wyławiam terminy zajęte

- trzecie cte - select data from cte1 except select data from cte2 - da ci wszystkie wolne terminy

a główne zapytanie - select min(data) from cte3 da Ci oczekiwany wynik.

Dla postgresa zapytanie wyglądało by tak:   (tabela cte "zajete" to dane z Twojego przykładu)

with zajete as (
  select 1 as id, 1 as m_id, '2022-05-13'::date as od, '2022-05-18'::date as do
  union all select 1, 1, '2022-05-19', '2022-05-21'
  union all select 1, 1, '2022-07-18', '2022-07-24'
  ), terminy as (
    select data::date from generate_series('2022-05-13', '2022-12-31', interval '1 day') as a (data)
    ), zajete_dni as (  
  select distinct terminy.data 
  from terminy
  join zajete on (terminy.data between zajete.od and zajete.do)
  ), wolne_dni as (
  select data
  from terminy
  except
  select data 
  from zajete_dni
  )
  
  select min(data) from wolne_dni
  

 

komentarz 4 dni temu przez Piotr Popławski Użytkownik (530 p.)
Dzięki bardzo, jednak jak by nie patrzył chyba sobie narobiłem pracy. I nie bardzo ogarnę to w zapytaniu tylko będę musiał przenieść to php aby szybciej to opracować.

Podobne pytania

0 głosów
1 odpowiedź 115 wizyt
pytanie zadane 12 lutego 2020 w PHP przez juske00 Początkujący (370 p.)
0 głosów
3 odpowiedzi 1,081 wizyt
pytanie zadane 18 kwietnia 2015 w PHP przez Hatter Gaduła (3,180 p.)
0 głosów
1 odpowiedź 414 wizyt
pytanie zadane 14 czerwca 2015 w PHP przez emwu Użytkownik (540 p.)

87,940 zapytań

136,518 odpowiedzi

304,382 komentarzy

58,305 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...