如何在SQL Server 2005中存储时区

7
我正在开发一个网络应用,用户可以输入活动信息,包括:
  • 活动标题
  • 开始日期/时间
  • 描述
用户希望在输入活动的开始日期/时间时,能够注明与该事件位置对应的时区。由于这些活动遍布全球,因此每个活动的时区都可能不同。
在 SQL Server 后端数据库中,我使用datetime来记录开始日期/时间。那么,我应该使用什么列类型来存储时区呢?int?float?decimal?请指导。

哪个版本的SQL Server?SQL Server 2008具有datetimeoffset... - mkedobbs
请参阅时区标签wiki中的“时区!=偏移量”。一个时区不能仅仅用一个数字来完全表示。 - Matt Johnson-Pint
3个回答

10

时区是棘手的,邪恶的东西。它们通常以UTC偏移量的形式存储,但即使如此,在夏令时更改时(如果有的话),也存在问题。

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


唉,原本是 datetime2。总是把它和 datetimeoffset 搞混 :( - Joel Coehoorn

5

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

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

正如Joel所说,时区是很棘手的。祝你好运...


0
如果您正在使用SQL Server 2008,您可以使用datetimeoffset而不是datetime。
否则,我会使用tinyint。

2
TINYINT 可能不够大。世界上有成百上千个时区,因为每个小地方都希望感到重要,并决定在其他所有地方之后的中午更改夏令时等等。我们的数据库当前显示了245个不同的时区。这可以适合于TINYINT,但勉强而已。 - Tom H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接