存储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可以为报告提供更多的灵活性,效率和简单性。