2017-01-26 89 views
1

在mysql中将微秒舍入到毫秒的最佳方式是什么?将微秒舍入到毫秒MySQL

例如,在日期时间(6)列,我们如何圆

2016年12月1日12:30:01.122456至2016年12月1日12:30:01.122

2016年12月1日12:30:01.122501至2016年12月1日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导致空值,但是如下:select 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')'给你什么? –