2012-12-04 15 views
13

Jak mogę zaokrąglić czasy w MySQL do najbliższych 15 minut (np. 0,15,30,45)?Jak zaokrąglić godzinę do najbliższego 15-minutowego segmentu?

+1

Czy możesz pokazać nam wszystko, co zrobiłeś do tej pory? :-) Następnie możemy zasugerować odpowiednio. – bonCodigo

+0

Dlaczego nie użyć 'timestampdiff' z' mod'? Btw biorę mój wcześniejszy komentarz, ponieważ nie zauważyłem, że odpowiedź jest przez ciebie. Mogłeś właśnie zaktualizować swoje pytanie, dołączając swój kod :-) – bonCodigo

Odpowiedz

17
SELECT SEC_TO_TIME(FLOOR((TIME_TO_SEC(CURTIME())+450)/900)*900) 

W tym przykładzie użyłem CURTIME() dla czasu wprowadzania, ale można użyć dowolnego pola czasu.

900 sekund = 15 minut (okres do zaokrąglenia do), 450 sekund jest o połowę niższy (aby podać element zaokrąglenia). Testowałem z 1800/900, aby uzyskać najbliższe pół godziny, powinienem współpracować z innymi (600/300 przez 10 minut itd.).

0

Oto trochę przybliżonego kodu, którego użyłem, który dostarczył wyniki naprawdę bliskie temu, co chciałem. Ponieważ nie używałem sekund, wybrałem minuty w połowie drogi.

SELECT 
     CASE 
      WHEN minute(timeIn) BETWEEN 0 and 7 THEN SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600) 
      WHEN minute(timeIn) BETWEEN 8 and 22 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '00:15:00') 
      WHEN minute(timeIn) BETWEEN 23 and 37 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '00:30:00') 
      WHEN minute(timeIn) BETWEEN 38 and 52 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '00:45:00') 
      WHEN minute(timeIn) BETWEEN 53 and 59 THEN ADDTIME(SEC_TO_TIME((TIME_TO_SEC(timeIn) DIV 3600) * 3600), '01:00:00') 
     END as 15_min 
    FROM 
     clock.punches; 
12
SELECT FROM_UNIXTIME(TRUNCATE(UNIX_TIMESTAMP(NOW())/900,0)*900); 

to można uogólnić na zaokrąglanie do dowolnej wartości czasu. 900 sekund = 15 minut. Możesz zastąpić 900 innym czynnikiem zaokrąglania.

+0

Tak, 900 można zmienić na dowolny czas, ale kod, który podałeś sam, zawsze będzie zaokrąglany w dół. – donL

+1

użyj funkcji CEIL() zamiast TRUNCATE() –

+2

Aby uzyskać jeszcze lepsze (szybsze) wyniki, użyj [dzielenia liczb całkowitych] (http://dev.mysql.com/doc/refman/5.0/en/arithmetic-functions.html#operator_div) (który zaokrągla w dół, nie w górę, ale to nie powinno mieć znaczenia) - lub odejmij "MOD 900" od liczby zamiast dzielenia i mnożenia. – Ariel

Powiązane problemy