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

Mysql - znajdowanie wolnego terminu

Object Storage Arubacloud
+2 głosów
248 wizyt
pytanie zadane 13 maja 2022 w SQL, bazy danych przez Piotr Popławski Użytkownik (610 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ź 13 maja 2022 przez Wiciorny Ekspert (269,710 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 13 maja 2022 przez Piotr Popławski Użytkownik (610 p.)
edycja 13 maja 2022 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 13 maja 2022 przez Wiciorny Ekspert (269,710 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ź 13 maja 2022 przez Piotr Popławski Użytkownik (610 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ź 15 maja 2022 przez areklipno Stary wyjadacz (11,930 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 15 maja 2022 przez Piotr Popławski Użytkownik (610 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ź 199 wizyt
pytanie zadane 12 lutego 2020 w PHP przez juske00 Początkujący (370 p.)
0 głosów
3 odpowiedzi 1,525 wizyt
pytanie zadane 18 kwietnia 2015 w PHP przez Hatter Gaduła (3,180 p.)
0 głosów
1 odpowiedź 785 wizyt
pytanie zadane 14 czerwca 2015 w PHP przez emwu Użytkownik (540 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...