Portál AbcLinuxu, 10. května 2025 14:14
CREATE TABLE IF NOT EXISTS `cars` ( `id` int(11) NOT NULL AUTO_INCREMENT, `registration_number` text CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL, `name` text CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `car_requests` ( `id` int(11) NOT NULL AUTO_INCREMENT, `car_id` int(11) NOT NULL COMMENT 'ID auta', `date_from` datetime NOT NULL COMMENT 'Datum od', `date_to` datetime NOT NULL COMMENT 'Datum do', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1 ;
Řešení dotazu:
SELECT DATE(car_requests.date_from), cars.registration_number, SUM(TO_SECONDS(car_requests.date_to) - TO_SECONDS(car_requests.date_from)) / (60 * 60) FROM cars LEFT JOIN car_requests ON car.id = car_requests.car_id GROUP BY 1,2
Tohle není úplně správně. Když bude auto zapůjčeno více než den, tak to vrátí jen první den a více než 24 hodin a pro další dny to nevrátí nic. Jediné opravdu správné řešení je mít tabulku dnů a s ní to správně spojovat.
Mohlo by fungovat něco jako (select píšu pouze schématicky, úplně se mi nechce ho ladit a nemá mysql) :
select car_requests.car_id, dny.datum, sum ( min(dny.datum+1, car_requests.date_to) - max(dny.datum, car_requests.date_from) ) from car_requests inner join dny on dny.datum <= car_requests.date_to and dny.datum + 1 >= car_requests.date_from group by car_requests.car_id, dny.datum
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.