2017-01-26 7 views
1

Как наилучший способ округления микросекунд до миллисекунд в mysql?Округление микросекунд до миллисекунд MySQL

Например, в (6) столбце даты и времени, как мы округлить

2016-12-01 12: 30: 01,122456 до 2016-12-01 12: 30: 01.122

и

2016-12-01 12: 30: 01,122501 до 2016-12-01 12: 30: 01,123

Благодаря

ответ

1

Попробуйте этот запрос:

SELECT FROM_UNIXTIME(TO_SECONDS(dt) - 
        TO_SECONDS('1970-01-01 00:00:00') + 
        (ROUND(MICROSECOND(dt)/1000, 0)/1000)) AS new_dt 
FROM yourTable 

Здесь dt является вашей колонкой datetime. Для пояснения, я сломаю вышеуказанный запрос, используя в качестве примера 2016-12-01 12:30:01.122456.

MICROSECOND(dt) = 122456 
ROUND(MICROSECOND(dt)/1000, 0) = 122 

затем

(ROUND(MICROSECOND(dt)/1000, 0)/1000)) = 0.122 

Так 0.122 это число дробных секунд в вашем datetime, который не содержит никакой точности в диапазоне микросекунд после округления.

TO_SECONDS(dt) = # seconds EXCLUDING the fractional part 

Наконец, мы берем число секунд в dt, так как 0 года и вычитать от количества секунд от 0 года до начала эпохи. Это оставляет нас с количеством секунд в dt с начала эпохи. Затем добавим количество секунд, за исключением дробной части, до 0.122, чтобы получить общее количество секунд нужного нового datetime. Наконец, мы используем FROM_UNIXTIME() для преобразования этого количества секунд назад в добросовестный datetime.

+0

Это не работает. FROM_UNIXTIME приводит к нулевому значению. TO_SECONDS работает, но FROM_UNIXTIME устанавливает значение NULL .. Любые идеи? Спасибо –

+0

SELECT FROM_UNIXTIME (TO_SECONDS ('2015-12-11 12: 31: 04.080000') + (ROUND (MICROSECOND ('2015-12-11 12: 31: 04.080000')/1000, 0)/1000)) AS new_dt приводит к нулевому значению, но следующее: выберите TO_SECONDS ('2015-12-11 12: 31: 04.080000') + (ROUND (MICROSECOND ('2015-12-11 12: 31: 04.080000')/1000, 0)/1000) возвращает значение. –

+0

Что делает 'MICROSECOND ('2015-12-11 12: 31: 04.080000')' дать вам? –