2013-10-10 15 views
7

Desidero aggiornare il datetime round a 15 minuti in una tabella di database MYSQL.MYSQL Round the datetime a 15 minute

Per esempio:

Se il dateTime è 2013-10-08 10:36:00, voglio convertirlo in 2013-10-08 10:30:00 Allo stesso modo, 2013-10-08 10:22:00-2013-10-08 10:15:00

ho visto this risposta, ma converte datetime in secondi e tempo di ritorno solo, Voglio anche un appuntamento.

Grazie

+2

possibile duplicato del [MYSQL Data Ora rotonda in ora più vicina] (http://stackoverflow.com/questions/9680144/mysql-date-time-round-to-nearest-hour) –

+1

vedere anche questo: http: // stackoverflow.com/questions/2480637/round-minute-down-to-nearest-quarter-hour –

+0

@TomaszKowalczyk: la prima domanda riguarda l'arrotondamento a intere ore con soluzioni piuttosto semplici. Quest'ultimo è PHP. – Kaivosukeltaja

risposta

6

La risposta che avete visto è molto utile, provate questo

SELECT SUBSTRING_INDEX(datetime_field, ' ', -1) AS old_time,SEC_TO_TIME((TIME_TO_SEC(datetime_field) DIV 900) * 900) AS rounded_time, datetime_field FROM yourtable 

È possibile ottenere il tempo dal campo datetime come sottostringa e sostituirlo con il tempo arrotondato.

se si desidera aggiornare il datetime è possibile rispondere e aggiornarlo con funzione di aggiornamento

UPDATE yourtable SET `datetime_field` = REPLACE(datetime_filed,SUBSTRING_INDEX(datetime_field, ' ', -1),SEC_TO_TIME((TIME_TO_SEC(datetime_field) DIV 900) * 900)) 

Mi auguro che aiuta ...

+0

grazie .. ha funzionato .. non è stato poi così difficile quello che mi aspettavo ... grazie ancora .. – Ana

0

Utilizzare lo stesso metodo in questione si è collegato, ma utilizzare UNIX_TIMESTAMP funzioni, invece. Questo verrà arrotondato verso il basso o fino ai 15 minuti più vicini, rimuovere la parte + 450 se si desidera arrotondare solo verso il basso.

mysql> select FROM_UNIXTIME(((UNIX_TIMESTAMP('2013-08-07 12:05') + 450) DIV 900) * 900) AS roundtime; 
+---------------------+ 
| roundtime   | 
+---------------------+ 
| 2013-08-07 12:00:00 | 
+---------------------+ 
+0

grazie, ho provato l'altra risposta e ha funzionato per me .. grazie comunque – Ana

0

È possibile modificare la risposta che avete trovato (se soddisfatti con esso) solo per data concatenando al tempo:

SELECT CONCAT(DATE(time_field), 
       ' ', 
       SEC_TO_TIME((TIME_TO_SEC(time_field) DIV 900) * 900)) 
FROM `your_table` 
+0

grazie, ho provato l'altra risposta e ha funzionato per me .. grazie comunque – Ana

6
SELECT NOW() x,FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(NOW())/900)*900) y; 
+---------------------+---------------------+ 
| x     | y     | 
+---------------------+---------------------+ 
| 2013-10-10 09:50:20 | 2013-10-10 09:45:00 | 
+---------------------+---------------------+ 
+0

grazie, ho provato l'altra risposta e ha funzionato per me .. grazie comunque – Ana

1

utilizzando UNIX_TIMESTAMP permette aritmetica abbastanza simpe, cambiare 15 in codice sottostante per qualche altro numero se necessario (ad esempio 30)

select from_unixtime(round(unix_timestamp('2013-10-08 10:36:00')/(60*15))*(60*15)); 

= October, 08 2013 10:30:00+0000 

select from_unixtime(round(unix_timestamp('2013-10-08 10:22:00')/(60*15))*(60*15)); 

= October, 08 2013 10:15:00+0000 

veda: http://forums.mysql.com/read.php?20,131939,201089#msg-201089