SQL 2008R2中的DateTimeOffset示例

rgx*_*x71 5 sql-server sql-server-2008

我对datetimeoffset在SQL Server 2008 r2中使用有疑问.

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

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

Szy*_*mon 9

根据MSDN:

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

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

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

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

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

更多关于datetimeoffsetMSDN.


创建表并插入数据

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
Run Code Online (Sandbox Code Playgroud)

当我选择数据时,我明白了

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
Run Code Online (Sandbox Code Playgroud)