01. november 2006 - 13:59
Der er
15 kommentarer
Finde tiden mellem slut og start på næste dato
Sidder lidt fast med dette problem. Jeg laver et udtræk fra min database som give f.eks: 2006-11-01 09:30:00 / 2006-11-01 10:15:00 2006-11-01 11:30:00 / 2006-11-01 12:15:00 2006-11-01 13:30:00 / 2006-11-01 14:15:00 hvordan finder jeg tiden der er imellem f.eks 2006-11-01 10:15:00 -> 2006-11-01 11:30:00 Regner med at skulle lave nogle timestamps men hvordan jeg kommer videre derfra ? Mit udtræk : $sql = "SELECT book_start, book_end, book_id "; $sql .= "FROM rs_data_bookings "; $sql .= "WHERE family_id = " . $_REQUEST["family_id"] . " "; $sql .= "AND ((rs_data_bookings.book_end > '" . $start . "' "; $sql .= "AND rs_data_bookings.book_end <= '" . $end . "') "; $sql .= "OR (rs_data_bookings.book_start < '" . $end . "' "; $sql .= "AND rs_data_bookings.book_start >= '" . $start . "') "; $sql .= "OR (rs_data_bookings.book_start <= '" . $start . "' "; $sql .= "AND rs_data_bookings.book_end >= '" . $end . "')) "; $sql .= "ORDER BY book_start ASC "; $bookings = db_query($database_name, $sql); <?php while($bookings_ = fetch_array($bookings)){ echo $bookings_["book_start"] . " / " . $bookings_["book_end"] . " <br> "; } ?>
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
01. november 2006 - 14:03
#1
En tanke: Er det ikke at lave dine strenge om til unixtime og beregne forskellen?
01. november 2006 - 14:12
#2
Lav det i MySQL med TIMEDIFF(start, end) AS diff :)
Fra manualen[1]:
mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001',
-> '1997-12-30 01:01:01.000002');
-> '46:58:57.999999'
Det tror jeg er det pæneste. Så kan du altid formatere diff'en bagefter med DATE_FORMAT hvis du synes.
[1]
http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html --
Morten Barklund
01. november 2006 - 14:31
#3
Kigger lige nærmere på TIMEDIF og vender derefter tilbage ;O)
02. november 2006 - 10:39
#4
Hhhmm.... Som jeg forstår det tager den kun date og ikke time med i regnestykket. Er der nogen som kan prøve at lave et script der viser hvordan jeg får difference mellem $bookings_["book_end"] -> til $bookings_["book_start"] . Jeg skal ikke bruge tiden mellem start/end men end/start.
02. november 2006 - 11:04
#5
DATEDIFF regner kun på dato-delen - TIMEDIFF regner også på tid. $sql = "SELECT book_start, book_end, book_id, DATE_FORMAT('%H:%i:%s',TIMEDIFF(book_end, book_start)) AS book_time "; $sql .= "FROM rs_data_bookings "; $sql .= "WHERE family_id = " . $_REQUEST["family_id"] . " "; $sql .= "AND ((rs_data_bookings.book_end > '" . $start . "' "; $sql .= "AND rs_data_bookings.book_end <= '" . $end . "') "; $sql .= "OR (rs_data_bookings.book_start < '" . $end . "' "; $sql .= "AND rs_data_bookings.book_start >= '" . $start . "') "; $sql .= "OR (rs_data_bookings.book_start <= '" . $start . "' "; $sql .= "AND rs_data_bookings.book_end >= '" . $end . "')) "; $sql .= "ORDER BY book_start ASC "; Vil muligvis gøre tricket :)
02. november 2006 - 11:31
#6
Får ikke nogen værdi ud af det. Har nok misforstået noget. <?php while($bookings_ = fetch_array($bookings)){ echo $bookings_["book_start"] . " / " . $bookings_["book_end"] . " / " . $bookings_["book_time"] . " <br> "; Skulle DATE_FORMAT('%H:%i:%s',TIMEDIFF(book_end, book_start)) AS book_time "; give difference mellem f.eks. $bookings_["book_end"] = 2006-11-01 10:15:00 frem til $bookings_["book_start"] = 2006-11-01 11:30:00
02. november 2006 - 11:46
#7
Hvis man gør sådan $dif = strtotime($bookings_["book_start"]) - strtotime($bookings_["book_end"]); hvordan får man den så til at vælge book_start på linie 2 og så kører videre i arrayet...
02. november 2006 - 12:06
#8
Jeg forstår ikke helt, hvad du vil. Du vil have mellemrummet mellem denne tid og den næste tid? Men ikke længden inden for den enkelte rækkes tid?
02. november 2006 - 13:16
#9
Det er tiden der er fra book_end frem til næste book_start. Så at jeg kan lave en liste med ledige tider i et givet tidsrum. Jeg har en form hvor man angiver start_tid og slut_tid for et $object der har en værdi i sek. f.eks. 1800 sek Så vil jeg lave en søgning i min database hvor den finder ledige tider mellem de andre bookinger, altså tidrummet mellem book_end frem til book_start. hvis der så er f.eks. 1800 sek mellem book_end -> book_start skal der være mulighed for at sætte $object ind i databasen. Håber det giver mening. ;O)
02. november 2006 - 13:51
#10
Det er ikke umiddelbart muligt med din datastruktur. Så skulle du have en selvstændig tabel over tider, som starter med en tid hver dag fra klokken 8 om morgenen til 16 om aftenen, som står til ledig - hvis nogen så vil booke ind en tid i en time fra kl. 10-11, så ender du med tre tider i tabellen - 8-10 er ledig, 10-11 er booked, og 11-16 er ledig - hvis du forstår? Det er lidt kompliceret at få struktureret og spillet op, når du først har lavet det, vil det virke meget bedre. -- Morten Barklund
02. november 2006 - 15:13
#11
Hvorfor kan man ikke lave noget a la : $dif_end = strtotime($bookings_["book_end"]); $dif_start = strtotime($bookings_["book_start"]); $dif = ($dif_start - $dif_end); if($dif_end < $dif_start); else ( "Ingen ledige tider" ); Det virker dog ikke endnu : (
02. november 2006 - 15:47
#12
Det kan man også godt, men det er en dårlig ide :) Jeg vil anbefale, hvad jeg foreslog herover - det vil blive bedst i længden og være nemmest at vedligeholde og videreudvikle. -- Morten Barklund
02. november 2006 - 16:19
#13
Hhhhmmmm ville helst holde det jeg har indtil nu. Kan du ikke hjælpe med at lave et script der virker med det jeg har kørerende : ) Så er pointene dine
03. november 2006 - 10:23
#14
Næh, for det bliver sgu noget bæ :) Jeg er stor tilhænger af, at gøre ting rigtigt - at spilde tid på at gøre det forkert (og ofte bruge mere tid på det, end at lave det om) er dumt :)
03. november 2006 - 11:57
#15
Hvordan vil du så sætte tabellen op når der er flere bruger at vælge imellem og den kører med 15 min intervaller? Her er min tabel som den ser ud nu: CREATE TABLE `rs_data_bookings` ( `book_id` int(10) unsigned NOT NULL auto_increment, `rand_code` smallint(5) unsigned default NULL, `book_date` datetime NOT NULL default '0000-00-00 00:00:00', `object_id` smallint(5) unsigned NOT NULL default '0', `user_id` smallint(5) unsigned NOT NULL default '0', `book_start` datetime NOT NULL default '0000-00-00 00:00:00', `book_end` datetime NOT NULL default '0000-00-00 00:00:00', `validated` tinyint(1) unsigned NOT NULL default '0', `misc_info` varchar(255) collate latin1_danish_ci NOT NULL default '', `family_id` smallint(5) NOT NULL default '0', PRIMARY KEY (`book_id`), KEY `book_date` (`book_date`), KEY `object_id` (`object_id`), KEY `user_id` (`user_id`), KEY `book_start` (`book_start`), KEY `book_end` (`book_end`), KEY `rand_code` (`rand_code`)
Vi tilbyder markedets bedste kurser inden for webudvikling