存储DateTime(UTC)与存储DateTimeOffset

Fre*_*ico 87 sql t-sql sql-server datetimeoffset sql-server-2008

我通常有一个"拦截器",它在从/向数据库读取/写入之前进行DateTime转换(从UTC到本地时间,从本地时间到UTC),因此我可以DateTime.Now在整个系统中使用(派生和比较)而不用担心关于时区.

关于计算机之间的序列化和移动数据,没有必要打扰,因为日期时间始终是UTC.

我应该继续以UTC格式存储我的日期(SQL 2008 - datetime)还是应该使用DateTimeOffset(SQL 2008-datetimeoffset)存储它?

数据库中的UTC日期(日期时间类型)已经工作并且已知很长时间了,为什么要更改它?有什么好处?

我已经看过像这样的文章了,但我并不是100%相信.有什么想法吗?

Mar*_*oth 118

有一个巨大的区别,你不能单独使用UTC.

  • 如果你有这样的场景

    • 一台服务器几台客户端(所有地理位置都在不同的时区)
    • 客户端使用日期时间信息创建一些数据
    • 客户端将其全部存储在中央服务器上
  • 然后:

    • datetimeoffset存储UTC时间和ALSO偏移到客户端的本地时间
    • 所有客户都知道所有数据的UTC时间以及信息来源地的当地时间
  • 但:

    • UTC日期时间仅存储UTC日期时间,因此您没有关于发起数据的客户端位置的本地时间的信息
    • 其他客户不知道该地点的当地时间,其中包含日期时间信息
    • 其他客户端只能从数据库(使用UTC时间)计算其本地时间,而不能计算发起数据的客户端的本地时间

简单的例子是机票预订系统...机票应该包含2次: - "起飞"时间(在"从"城市的时区) - "着陆"时间(在"目的地"城市的时区)

  • 你说"datetimeoffset存储UTC时间和ALSO偏移到客户端的本地时间",但datetimeoffset存储LOCAL时间+偏移量,或UTC时间+偏移量等于+0. (17认同)
  • 这是我在适当的时候读到的最好的解释,我已经阅读了很多对我们来说,从这看起来似乎并非如此.我们以UTC的形式获取外部数据的时间,如果需要,我们知道来自其他来源的位置(并且从未有过).谢谢你让它看起来如此明显. (2认同)
  • 似乎更像DateTmeOffset存储"本地时间和UTC偏移",而不是"UTC时间和UTC偏移".如果转换为datetime或使用任何datepart函数,则会获得本地日期和时间组件. (2认同)

Ben*_*Ben 22

在所有历史时间(即记录事件发生)使用UTC是绝对正确的.始终可以从UTC到当地时间,但并不总是相反.

什么时候使用当地时间?回答这个问题:

如果政府突然决定改变夏令时,您希望这些数据随之改变吗?

如果答案为"是",则仅存储当地时间.显然,这仅适用于未来的日期,通常仅适用于以某种方式影响人们的日期.

为什么要存储时区/偏移量?

首先,如果您想记录执行操作的用户的偏移量,您可能最好这样做,即在登录时记录该用户的位置和时区.

其次,如果要转换显示,则需要有一个包含该时区所有本地时间偏移转换的表,只需知道当前偏移量是不够的,因为如果您显示的是六个月前的日期/时间,那么偏移将是与众不同.

  • 当夏令时更改为历史日期时,会考虑Windows UTC到本地时间转换.我不明白你为什么要在这种情况下存储当地时间. (4认同)
  • 当然,您还必须存储事件的位置,否则,您不能说事件发生在什么“本地时间”。 (2认同)

Pap*_*nUK 18

DATETIMEOFFSET使您能够在一个字段中存储本地时间和UTC时间.

这允许在本地或UTC时间进行非常简单和有效的报告,而无需以任何方式处理数据以进行显示.

这是两个最常见的要求 - 本地报告的本地时间和组报告的UTC时间.

本地时间存储在DATETIMEOFFSET的DATETIME部分中,而来自UTC的OFFSET存储在OFFSET部分中,因此转换很简单,因为它不需要知道数据来自的时区,所有都可以在数据库级别完成.

如果您不需要几毫秒的时间,例如几分钟或几秒,您可以使用DATETIMEOFFSET(0).然后,DATETIMEOFFSET字段只需要8个字节的存储空间 - 与DATETIME相同.

因此,使用DATETIMEOFFSET而不是UTC DATETIME可以为报告提供更大的灵活性,效率和简便性.