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
risposta
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.).
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;
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.
Sì, il 900 può essere modificato in qualsiasi quantità di tempo, ma il codice che hai fornito da solo arriverà sempre per difetto. – donL
usa CEIL() invece di TRUNCATE() –
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
Puoi mostrarci qualcosa che hai fatto finora? :-) Quindi potremmo suggerire di conseguenza. – bonCodigo
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