背景
在使用InfluxDB时,发现由于InfluxDB使用的是UTC时间,在查询时经常会遇到时区的问题,所以写了这篇文章,记录一下InfluxDB中时间相关的操作。
时间格式
InfluxDB除了支epoch_time
外,还支持rfc3339_date_time_string
和rfc3339_like_date_time_string
。
epoch_time
理论一些的解释是从协调世界时(Thursday, 1 January 1970)开始至今过去的时间。比如我们在java程序中使用System.currentTimeMillis()
得到的就是这个时间。一般情况下为毫秒级(ms)精度,即13位Long类型。而在InfluxDB中,时间戳的精度可以达到纳秒级(ns)即19位Long类型。
rfc3339_date_time_string
rfc3339时间格式是ietf协会定义的一种时间格式,这个名字是因为它被定义在rfc3339中。感兴趣的同学可以自己查看上面的连接。InfluxDB中rfc3339的时间格式是这样的:
'YYYY-MM-DDTHH:MM:SS.nnnnnnnnnZ'
其中nnnnnnnnn
是可选的,如果不写则会被设置为000000000
。注意,如果使用这种时间格式,需要使用单括号(')将时间括起来。
rfc3339_like_date_time_string
因为rfc3339_date_time_string
的格式确实比较反人类,所以InfluxDB也支持这种人类阅读更友好的格式:
'YYYY-MM-DD HH:MM:SS.nnnnnnnnn'
其中HH:MM:SS.nnnnnnnnn
是可选的,如果不填写会被设置为00:00:00.000000000
。所以查询时可以设置到天、小时、分钟、秒等不同精度。这种时间格式同样要求被单括号括起来。
调整时间戳精度
InfluxDB默认东时间是纳秒(ns),即19位时间戳。但是一般情况下时间精度不会这么高。所以如果使用秒级精度查询:
select * from disk where time >= 1542954639s and time <= 1542964713s
如果使用毫秒级精度查询:
select * from disk where time >= 1542954639000ms and time <= 1542964714000ms
其它精度类似。
调整时区
如果需要使用北京时间(东八区),可以在SQL中使用tc
关键字:
select * from disk where time >= '2018-11-23 14:30:39' and time <= '2018-11-23 14:32:32' tz('Asia/Shanghai')
嗯,虽然实际上是上海。
总结
综上,在查询时推荐使用字符串时间格式yyyy-MM-dd HH:mm:ss
并结合tc
关键字调整时区这种方式,或者使用epoch time,然后在后面指定精度。注意在使用字符串类型的时候需要加上单括号,而epoch类型是不加单括号的。
网友评论