【问题标题】:How to store timezone in SQL Server 2005如何在 SQL Server 2005 中存储时区
【发布时间】:2010-12-22 01:27:57
【问题描述】:

我正在构建一个网络应用程序,用户可以在其中输入事件,包括

  • 活动标题
  • 开始日期/时间
  • 说明

用户希望输入开始日期/时间,包括与活动地点相对应的时区。这些活动是全球性的,因此时区可能会因活动而异。

在 SQL Server 后端数据库中,我使用 datetime 作为开始日期/时间。我应该使用什么列类型来存储时区?诠释?漂浮?十进制?

【问题讨论】:

  • SQL Server 的哪个版本? SQL Server 2008 有 datetimeoffset...
  • 具体参见the timezone tag wiki 中的“时区!= 偏移量”。一个时区不能完全用一个数字来表示。

标签: sql-server sql-server-2005 datetime timezone


【解决方案1】:

时区是棘手的、邪恶的事情。它们通常存储为 UTC 偏移量,但即便如此,在夏令时转换时(如果有的话)也存在问题。

如果您使用的是 Sql Server 2008,则可以使用 datetimeoffset 类型,其中包括带有值的 utc 偏移量。否则,您将需要两列。

【讨论】:

  • 呃,原来有datetime2。总是混淆 datetimeoffset :(
【解决方案2】:

由于您使用的是 SQL Server 2005,我建议将时区作为字符串存储在数据库中,特别是 32 个字符的字符串,因为这是 Windows 注册表中时区标识符的长度限制。

保存的值应该是 TimeZoneInfo ID 属性中的值(例如“东部标准时间”),以便您可以更轻松地在 .NET Framework 中进行计算。

正如乔尔所说,时区是邪恶而棘手的。祝你好运……

【讨论】:

    【解决方案3】:

    如果您使用的是 SQL Server 2008,则可以使用 datetimeoffset 代替 datetime。

    否则,我会使用 tinyint。

    【讨论】:

    • TINYINT 可能不够大。世界上有数百个时区,因为每个小地方都想感觉自己很重要,并决定他们的夏令时在其他人之后的第二天中午改变,等等。数据库目前显示 245 个不同的时区。这将适合 TINYINT,但几乎没有。
    猜你喜欢
    • 2010-09-09
    • 2011-09-06
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多