存储DateTime(UTC)与存储DateTimeOffset
我通常有一个“拦截器”就在读/写数据库之前做date时间转换(从UTC到本地时间,从本地时间到utc),所以我可以在整个系统中使用DateTime.Now(派生和比较)担心时区。
关于计算机之间的序列化和移动数据,不需要打扰,因为date时间总是UTC。
我应该继续以UTC格式存储date(SQL 2008 – datetime),还是应该使用DateTimeOffset(SQL 2008 – datetimeoffset)来存储date?
UTC在数据库中的date(date时间types)一直在工作和知道这么久,为什么要改变它? 有什么优势?
我已经看过这样的文章,但我不是100%相信。 有什么想法吗?
有一个巨大的差异,你不能单独使用UTC。
-
如果你有这样的情况
- 一个服务器和几个客户端 (全部地理位置在不同的时区 )
- 客户使用date时间信息创build一些数据
- 客户将其全部存储在中央服务器上
-
然后:
- datetimeoffset存储UTC时间和ALSO偏移到客户端的本地时间
- 所有的客户都知道UTC时间的所有数据,也是当地时间的信息来源
-
但:
- UTCdate时间只存储UTCdate时间 ,所以您没有关于数据发起的客户端位置的本地时间的信息
- 其他客户不知道当地时间,哪里有date时间信息
- 其他客户端只能从数据库(使用UTC时间)计算它们的本地时间,而不是客户端的本地时间(数据来自哪里)
简单的例子是机票预订系统…机票应包含2次: – “起飞”时间(在“从”城市)的时区 – “着陆”时间(在“目的地”城市的时区)
在所有历史时间使用UTC是完全正确的(即录制事件发生)。 从UTC到当地时间总是可能的,但并不总是相反。
何时使用当地时间? 回答这个问题:
如果政府突然决定改变夏令时,你会喜欢这个数据改变吗?
只有当答案是“是”时才存储当地时间。 显然,这只会是未来的日子,通常只会在某些方面影响人的date。
为什么要存储时区/偏移?
首先,如果你想要logging执行该操作的用户的偏移量,最好的方法是在login时logging该用户的位置和时区。
其次,如果你想转换显示,你需要有一个表的所有本地时间偏移转换为该时区,只是知道当前的偏移量是不够的,因为如果你显示从六个月前的date/时间偏移将与众不同
DATETIMEOFFSET使您能够将本地时间和UTC时间存储在一个字段中。
这允许在本地或UTC时间进行非常简单而有效的报告,而不需要以任何方式处理数据进行显示。
这是两个最常见的要求 – 本地报告的本地时间和组报告的UTC时间。
本地时间存储在DATETIMEOFFSET的DATETIME部分,UTC的OFFSET存储在OFFSET部分,因此转换非常简单,因为它不需要了解数据的时区知识,所有这些都可以在数据库级完成。
如果您不需要几毫秒的时间,例如只需要几分钟或几秒钟,就可以使用DATETIMEOFFSET(0)。 DATETIMEOFFSET字段将只需要8个字节的存储空间 – 与DATETIME相同。
因此,使用DATETIMEOFFSET而不是UTC DATETIME可以为报告提供更多的灵活性,效率和简单性。