SQL 2008R2中的DateTimeOffset示例

时间:2013-11-13 20:40:18

标签: sql-server sql-server-2008

我怀疑在SQL Server 2008 r2中使用datetimeoffset

假设我有一个Web应用程序,西班牙的数据库服务器和客户端在加拿大。我不知道西班牙和加拿大之间的时区,但假设它在西班牙的时间超过5小时。 因此,加拿大的用户希望在下午23:00添加新的员工,当点击保存时,它会调用内部调用函数SYSDATETIMEOFFSET()的存储过程来填充具有数据类型{{CreatedDate的列datetimeoffset(7)。 1}}。

在这种情况下,数据库中保存的日期时间是多少?以及如何向加拿大用户显示想要查看CreatedDate的正确日期时间?有没有好的例子来检查这个?

2 个答案:

答案 0 :(得分:9)

根据MSDN:

  

数据存储在数据库中,并以UTC格式在服务器中进行处理,比较,排序和索引。时区偏移量将保留在数据库中以供检索。

在您的示例中,数据将以二进制格式存储,可以转换为14 Nov 2013 23:00 -5:00,这意味着本地的日期和时间加上-5小时到UTC的时间偏移(让我们假设这个是加拿大的补偿。)

存储此类型的值时,您必须自己提供偏移量,系统不会自动执行此操作。

由于数据存储为UTC时间,因此可以轻松地对数据进行比较,排序等,同时始终可以检索原始时间偏移。

在存储有关需要跨时区比较的事件的信息时,通常应将客户的本地时间与偏移量存储在一起。

MSDN上的datetimeoffset更多信息。


实施例

创建表格并插入数据

create table dto (dto datetimeoffset(7))

insert into dto values (GETDATE()) -- inserts date and time with 0 offset
insert into dto values (SYSDATETIMEOFFSET()) -- current date time and offset
insert into dto values ('20131114 08:54:00 +10:00') -- manual way

当我选择数据时,我得到了

2013-11-14 07:56:17.2300000 +00:00 -- current time, no offset so useless in this case
2013-11-14 07:56:17.2338125 +11:00 -- current time with my local offset (in Australia)
2013-11-14 08:54:00.0000000 +10:00 -- manually inserted data

答案 1 :(得分:0)

您可以简单地将 UTC 日期存储在您的数据库中

Select GetUTCDate()

例如,DB Server 位于西班牙,而客户端位于加拿大 在系统中添加新的员工加入日期。 (UTC 日期)14 Nov 2013 23:00

因此,如果您想向加拿大的用户显示正确的 DateTime,您需要添加/减去您当前的时区偏移量,就像在加拿大是 UTC-4 所以

Select Cast('14 Nov 2013 23:00' as Datetime) as [UTC TIME]
Select DateAdd(hour,+2,Cast('14 Nov 2013 23:00' as Datetime))  as [Time In Spain]
Select DateAdd(hour,-4,Cast('14 Nov 2013 23:00' as Datetime))  as [Time In Canada]

结果

14 Nov 2013 23:00
15 Nov 2013 01:00
14 Nov 2013 19:00

你可以做一些函数来做到这一点...