Попробуйте этот запрос:
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
.
Это не работает. FROM_UNIXTIME приводит к нулевому значению. TO_SECONDS работает, но FROM_UNIXTIME устанавливает значение NULL .. Любые идеи? Спасибо –
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) возвращает значение. –
Что делает 'MICROSECOND ('2015-12-11 12: 31: 04.080000')' дать вам? –