2012-12-04 12 views
13

Come posso arrotondare i tempi in MySQL ai 15 minuti più vicini (ad esempio 0,15,30,45)?Come arrotondare il tempo al segmento di 15 minuti più prossimo

+1

Puoi mostrarci qualcosa che hai fatto finora? :-) Quindi potremmo suggerire di conseguenza. – bonCodigo

+0

Perché non usare un 'timestampdiff' con' mod'? A proposito, prendo il mio commento precedente mentre non noto che la risposta è da voi. Potresti aver appena aggiornato la tua domanda aggiungendo il tuo codice :-) – bonCodigo

risposta

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

In questo esempio ho usato CURTIME() per il tempo di immissione, ma è possibile utilizzare qualsiasi campo di tempo.

900 secondi = 15 minuti (il periodo da arrotondare a), 450 secondi è la metà di quello (per fornire l'elemento di arrotondamento). Ho provato con 1800/900 per ottenere la mezz'ora più vicina, dovrebbe funzionare con gli altri (600/300 per 10 minuti, ecc.).

0

Ecco un codice approssimativo che ho utilizzato per ottenere risultati davvero vicini a ciò che volevo. Perché non ho usato secondi ho appena scelto minuti vicino al punto di mezzo.

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); 

Questo può essere generalizzato per arrotondare a qualsiasi valore di tempo. 900 secondi = 15 minuti. È possibile sostituire il 900 con qualsiasi altro fattore di arrotondamento.

+0

Sì, il 900 può essere modificato in qualsiasi quantità di tempo, ma il codice che hai fornito da solo arriverà sempre per difetto. – donL

+1

usa CEIL() invece di TRUNCATE() –

+2

Per risultati ancora migliori (più veloci) usa [divisione intera] (http://dev.mysql.com/doc/refman/5.0/en/arithmetic-functions.html#operator_div) (che arrotonda, non su, ma non dovrebbe importare) - o sottrarre il 'MOD 900' dal numero invece di dividere e moltiplicare. – Ariel

Problemi correlati