【发布时间】:2013-06-27 12:29:46
【问题描述】:
我们正在 C# 4 中开发一个使用 SQL Server 2008 R2 作为后端的应用程序。在极少数情况下,SQL Server Compact 4 也用于断开连接的客户端。我们想知道将日期/时间数据存储到这些数据库中的最佳方式是什么,以便:
- 包含不同时间偏移(来自不同时区)的数据可以很好地共存。这意味着要进行排序和比较。
- SQL Server 2008 R2 和 SQL Server Compact 4 中的数据可以无缝来回传输;这是一个次要要求,不应损害所选设计。
我们主要关心的是保留每个记录事件的本地时间,但不会失去比较和排序从不同时区生成的事件的能力,因此具有不同的时间偏移。
我们已经考虑了datetimeoffset 数据类型,因为它存储了时间偏移并且因为它很好地映射到.NET 的DateTimeOffset。但是,SQL Server Compact 4 不支持它。另一种方法是从数据库中删除偏移信息并使用简单的datetime 数据类型,以便数据库中的每条数据都被规范化,并且 Compact 的问题更少。但是,这会带来一个问题,即在用户看到数据之前,需要在检索时以某种方式重建偏移信息。
所以我的问题是,考虑到我们需要处理不同的时区,以及在 2008 R2 和 Compact 之间实现互操作性,是否有任何关于如何在 SQL Server 中存储日期/时间值的最佳实践或指南4 尽可能简单?
谢谢。
【问题讨论】:
-
请注意,datetimeoffset 并不真正存储时区 - 它仅存储偏移量。这并不能告诉您它是在哪个时区观察到的,即 10 分钟后的当地时间,当偏移量可能发生变化时。这些值意味着什么?只是瞬间?从根本上说,您需要保留原始偏移量,还是只对发生某事的那一刻感兴趣?
-
@JonSkeet:你是对的;我必须承认我没有这样看。我们有兴趣知道事件的本地时间,但还需要能够将每个事件的时间与可能在不同地点生成的其他事件进行比较,因此在不同的时区(因此具有不同的偏移量) )。
-
好的 - 如果您确实需要当地时间,那么您需要以一种或另一种方式存储偏移量。接下来,您需要考虑是否需要能够在本地时间查询此数据 - 例如,您可以将 DateTime 值存储在 UTC 中,并将偏移量存储在单独的列中......使全球订购变得容易,但在本地搜索相对困难......
-
@JonSkeet:我们宁愿优化本地时间而不是全局比较/排序。也许将 DateTime 存储在 local 时间,并将偏移量存储为单独的列?或者,DateTimeOffset?有关 SQL Server 的 DateTimeOffset 工作情况以及与 .NET 集成的任何指南/最佳实践?
-
使用 SqlServerCE 是我建议不要使用 DateTimeOffset 的原因。但是,是的,您可以使用本地 DateTime 和偏移量来 subtract 来获取 UTC。
标签: sql-server-2008 timezone sql-server-ce datetimeoffset