我知道这是一个常见的问题,并已在此论坛上得到解答,但我的问题仅针对一个场景。 我将传感器数据存储在数据库表中
CREATE TABLE `sensordata` (
`userID` varchar(45) NOT NULL DEFAULT '',
`instrumentID` varchar(10) NOT NULL DEFAULT '',
`utcDateTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`localDateTime` datetime DEFAULT NULL,
`data` varchar(200) DEFAULT NULL,
PRIMARY KEY (`userID`,`instrumentID`,`utcDateTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
localDateTime
列是多余的,所以我想摆脱它,但我必须跟踪当地时间,因为我们允许用户更改传感器的时区,这就是我保持当地时间的原因记录的数据。我还想将utcDateTime
的数据类型更改为timestamp
,以便我可以在SELECT查询中执行时间转换。例如,
If a sensor is recording in Sydney, one day the user changes its timezone to UTC, how will I know which data is for what time (if I use the current timezone of the sensor).
我应该坚持使用此架构还是应该创建另一个表来跟踪时区更改并根据该解析日期? 如果有更好的解决方案,请提出建议。 感谢
答案 0 :(得分:2)
我会在传感器读数时使用DATETIME存储UTC + 0时间和localTimeOffset(以分钟为单位)。为什么呢?
偏差随时间的变化并不是一个简单的逻辑 - 随着时间的推移,不同国家可能会有所不同,DST的变化也会有所不同。一些国家在其时区进行DST调整,一些国家(我认为澳大利亚就是其中之一)改变了时区。
使用utcDatetime和localTimeOffset可以让您在任何情况下重现事件的确切时间,包括更改传感器的时区,并允许您将事件时间转换为用户的时区时间。
附注:您必须在几分钟内存储localTimeOffset,因为有些国家/地区的偏移量为UTC + 05:45(尼泊尔)
答案 1 :(得分:1)
我的两分钱是使用" servertimestamp"和一个" localtimestamp",这样你就可以看到哪个时间戳是哪个。接下来我会制作一个" eventlog"在更改他/她的配置时查看哪个用户。