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

Mysql - znajdowanie wolnego terminu

VPS Starter Arubacloud
+2 głosów
247 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,120 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,120 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ź 197 wizyt
pytanie zadane 12 lutego 2020 w PHP przez juske00 Początkujący (370 p.)
0 głosów
3 odpowiedzi 1,519 wizyt
pytanie zadane 18 kwietnia 2015 w PHP przez Hatter Gaduła (3,180 p.)
0 głosów
1 odpowiedź 770 wizyt
pytanie zadane 14 czerwca 2015 w PHP przez emwu Użytkownik (540 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...