6

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

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

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

4

2 回答 2

13

根据 MSDN:

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

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

当您存储这种类型的值时,您必须自己提供偏移量,系统不会自动提供。

由于数据存储为UTC时间,便于数据的比较、排序等,同时可以随时检索原始时间偏移量。

在存储有关需要跨时区比较的事件的信息时,您通常应该存储客户端的本地时间和偏移量。

datetimeoffset有关MSDN的更多信息。


例子

创建表并插入数据

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
于 2013-11-13T20:46:43.507 回答
0

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

Select GetUTCDate()

例如,数据库服务器在西班牙,而加拿大的一个客户端在系统中添加了一个新的员工入职日期。(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

你可以做一些功能来做到这一点......

于 2021-06-25T16:52:49.540 回答