2013-10-10 4 views
7

Я хочу обновить раунд datetime до 15 минут в таблице базы данных MYSQL.MYSQL Круглый день и до 15 минут

Для примера:

Если DATETIME является 2013-10-08 10:36:00, я хочу, чтобы преобразовать его в 2013-10-08 10:30:00 Аналогично, 2013-10-08 10:22:00 к 2013-10-08 10:15:00

Я видел this ответ, но он преобразует DateTime в секунды и вернуться только время, Мне нужна дата.

Благодаря

+2

Возможный дубликат [MYSQL Date Time Round To Nearest Hour] (http://stackoverflow.com/questions/9680144/mysql-date-time-round-to-nearest-hour) –

+1

Также см. Это: http: // stackoverflow.com/questions/2480637/round-minute-down-to-nearest-quarter-hour –

+0

@TomaszKowalczyk: Первый вопрос касается округления до целых часов, который имеет довольно простые решения. Последний - PHP. – Kaivosukeltaja

ответ

6

Ответ вы видели весьма полезно, попробуйте этот

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 

Вы можете получить время из datetime_field в качестве подстроки и заменить его на округленное время.

, если вы хотите обновить DateTime вы можете ответить на него и обновить его с помощью функции обновления

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

Я надеюсь, что помогает ...

+0

спасибо .. Это сработало .. Это было не так сложно, что я ожидал ... Еще раз спасибо .. – Ana

0

Используйте тот же метод, что и в вопросе вы связаны, но использовать UNIX_TIMESTAMP функции вместо. Это будет округлено либо вниз, либо до ближайших 15 минут, удалите часть + 450, если вы хотите округлить только вниз.

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

спасибо, я попробовал другой ответ, и это сработало для меня .. спасибо в любом случае – Ana

0

Вы можете изменить ответ, который вы нашли (если вы удовлетворены с ним) просто конкатенации даты времени:

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

спасибо, я попробовал другой ответ, и он работал для меня .. спасибо в любом случае – 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

спасибо, я попробовал другой ответ, и это сработало для меня .. спасибо в любом случае – Ana

1

с использованием UNIX_TIMESTAMP позволяет довольно SimPE арифметику, изменение 15 в код ниже некоторого другого числа, если это необходимо (например, 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 

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

Смежные вопросы