SQL Server如何在不同时区持久保存和使用时间

时间:2010-11-23 15:10:13

标签: sql datetime timezone

在SQL Server中,我想创建一个表来节省事件的时间,并希望将其转换为用户选择的时区以便显示。让我们说如果在格林尼治标准时间下午1点在伦敦发生事件,那将是美国东部时间早上8点。

鉴于此示例,我想创建一个框架作品

  1. 用户可以保存事件和时间(给予事件的时区)

  2. 阅读这些活动,时间显示在他喜欢的时区(美国东部时间)

  3. 如何在SQL Server中完成此任务。

3 个答案:

答案 0 :(得分:4)

在SQL Server 2008中,使用DATETIMEOFFSET数据类型,该数据类型是DATETIME加上包含的时区偏移量。

SELECT CAST('2010-11-23 16:35:29+09:00' AS datetimeoffset) 

将于2010年11月23日下午4:35在+9小时(从格林威治标准时间)开始。

SQL Server 2008还包含用于将DATETIMEOFFSET值从一个时区转换为另一个时区的函数和SQL命令:

SELECT 
SWITCHOFFSET(CAST('2010-11-23 16:35:29+09:00' AS datetimeoffset), '+01:00')

会导致:

2010-11-23 08:35:29.0000000 +01:00

同一时间,不同的时区(距GMT +1小时)

答案 1 :(得分:0)

  1. 保存数据时,请保存GMT,而不是用户的本地时间(在c#中为DateTime.UtcNow
  2. 在您的应用程序逻辑中,记录用户的时区,并在运行时使用时区偏移将GMT时间转换为用户的本地时间。

答案 2 :(得分:0)

我解决类似问题的方法是执行以下操作:

  1. 表格设计仅存储GMT时间。
  2. 所有输入都通过存储过程,需要输入时区偏移。
  3. 数据请求是Table-Valued Function,带有时区偏移的输入。