Zadanie 17 (egzaminacyjne): Wypożyczalnia rowerów miejskich — obliczenia na datach
Trudny / egzaminacyjnyPo co się tego uczymy?
To zadanie wymaga policzenia CZASU TRWANIA wypożyczenia na podstawie dwóch kolumn DATETIME — bardzo częsta, praktyczna umiejętność w prawdziwych systemach.
Treść zadania
Scenariusz: Miejski system wypożyczalni rowerów śledzi każdą trasę.
Krok 1: Zaimportuj bazę z kodu poniżej.
Krok 2 — zapytania:
1. Pokaż wszystkie wypożyczenia, które NIE zostały jeszcze zakończone (czas_koniec IS NULL).
2. Dla zakończonych wypożyczeń oblicz czas trwania w minutach (podpowiedź: TIMESTAMPDIFF(MINUTE, czas_start, czas_koniec)).
3. Znajdź najdłuższe wypożyczenie w całej bazie.
4. Pokaż liczbę wypożyczeń z każdej stacji (JOIN Rowery+Wypozyczenia+Stacje + GROUP BY).
5. Znajdź rowery oznaczone jako "uszkodzony", które mimo to mają zarejestrowane jakiekolwiek wypożyczenie (sprawdź spójność danych).
6. Znajdź stację, z której wypożyczono najwięcej rowerów elektrycznych.
Jak zabrać się do zadania
1. Pobierz plik .sql przyciskiem w sekcji "Rozwiązanie" na dole strony.
2. Uruchom Apache i MySQL w XAMPP Control Panel.
3. W phpMyAdmin utwórz pustą bazę danych o podanej nazwie.
4. Kliknij w nazwę tej bazy w lewym panelu, żeby ją wybrać jako aktywną.
5. Przejdź do zakładki "Importuj" (nie "SQL"), kliknij "Wybierz plik", wskaż pobrany plik i kliknij "Wykonaj".
6. Dopiero po potwierdzonym imporcie przejdź do wykonywania zapytań z listy.
Jak powinien wyglądać efekt
Zapytanie 1 (niezakończone wypożyczenia) powinno zwrócić dokładnie jeden wiersz — sprawdź w danych startowych, które wypożyczenie ma czas_koniec ustawiony na NULL. Zapytanie 5 sprawdza spójność danych — jeśli w Twojej bazie żaden uszkodzony rower nie ma wypożyczenia, to POPRAWNY wynik (pusty), nie błąd zapytania.
Typowe problemy i jak sobie z nimi poradzić
Funkcja TIMESTAMPDIFF zwróci błędny albo pusty wynik dla wierszy, gdzie czas_koniec jest NULL (wypożyczenie w trakcie) — pamiętaj, żeby takie wiersze wykluczyć warunkiem WHERE czas_koniec IS NOT NULL, jeśli liczysz średnią czy sumę czasów.
Nawiązanie do egzaminu zawodowego
To zadanie w konwencji egzaminacyjnej ćwiczy jednostkę INF.03.4 jako całość — dokładnie tak wygląda część "Operacje na bazie danych" prawdziwego arkusza części praktycznej egzaminu INF.03.
Kryteria sukcesu — sprawdź, czy wykonałeś zadanie poprawnie
Po wykonaniu zadania sprawdź, czy:
1. zapytanie 1 znajduje dokładnie te wypożyczenia, które mają czas_koniec = NULL,
2. zapytanie 2 poprawnie liczy minuty przez TIMESTAMPDIFF,
3. wykluczyłeś z obliczeń średniej/sumy czasu wiersze z niezakończonym wypożyczeniem,
4. zapytanie 5 sprawdza spójność danych (rower uszkodzony, a mimo to wypożyczony).
Rozwiązanie — gotowa baza danych
Pobierz plik i zaimportuj go w phpMyAdmin przez zakładkę „Importuj” — dokładnie tak, jak wygląda to na prawdziwym egzaminie. Blok kodu poniżej to podgląd zawartości tego samego pliku, przydatny do sprawdzenia struktury bez otwierania go osobno.
CREATE DATABASE IF NOT EXISTS wypozyczalnia_rowerow;
USE wypozyczalnia_rowerow;
CREATE TABLE Stacje (
id_stacji INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(60), liczba_stojakow INT
);
CREATE TABLE Rowery (
id_roweru INT AUTO_INCREMENT PRIMARY KEY,
typ VARCHAR(30), id_stacji INT, stan_techniczny VARCHAR(20) DEFAULT 'sprawny',
FOREIGN KEY (id_stacji) REFERENCES Stacje(id_stacji)
);
CREATE TABLE Klienci (
id_klienta INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(50), nazwisko VARCHAR(50)
);
CREATE TABLE Wypozyczenia (
id_wypozyczenia INT AUTO_INCREMENT PRIMARY KEY,
id_klienta INT, id_roweru INT,
czas_start DATETIME, czas_koniec DATETIME,
FOREIGN KEY (id_klienta) REFERENCES Klienci(id_klienta),
FOREIGN KEY (id_roweru) REFERENCES Rowery(id_roweru)
);
INSERT INTO Stacje (nazwa, liczba_stojakow) VALUES
('Rynek Główny', 20), ('Dworzec Główny', 15), ('Park Miejski', 10), ('Kampus', 12);
INSERT INTO Rowery (typ, id_stacji, stan_techniczny) VALUES
('miejski', 1, 'sprawny'), ('miejski', 1, 'sprawny'), ('elektryczny', 1, 'uszkodzony'),
('miejski', 2, 'sprawny'), ('elektryczny', 2, 'sprawny'), ('miejski', 3, 'sprawny'),
('miejski', 3, 'uszkodzony'), ('elektryczny', 4, 'sprawny'), ('miejski', 4, 'sprawny');
INSERT INTO Klienci (imie, nazwisko) VALUES
('Wiktor','Krajewski'),('Zuzanna','Mazurek'),('Adrian','Sikorski'),('Weronika','Kowalik');
INSERT INTO Wypozyczenia (id_klienta, id_roweru, czas_start, czas_koniec) VALUES
(1,1,'2026-03-01 08:00','2026-03-01 08:25'),
(2,4,'2026-03-01 09:10','2026-03-01 09:40'),
(3,6,'2026-03-01 10:00','2026-03-01 10:20'),
(1,2,'2026-03-02 08:05','2026-03-02 08:50'),
(4,8,'2026-03-02 12:00','2026-03-02 12:15'),
(2,5,'2026-03-02 17:00','2026-03-02 17:45'),
(3,9,'2026-03-03 07:30','2026-03-03 08:10'),
(1,4,'2026-03-03 18:00', NULL);