3

我们正在 C# 4 中开发一个使用 SQL Server 2008 R2 作为后端的应用程序。在极少数情况下,SQL Server Compact 4 也用于断开连接的客户端。我们想知道将日期/时间数据存储到这些数据库中的最佳方式是什么,以便:

  1. 包含不同时间偏移量(来自不同时区)的数据可以很好地共存。这意味着被排序和比较。
  2. SQL Server 2008 R2 和 SQL Server Compact 4 中的数据可以无缝来回传输;这是一个不应该影响所选设计的次要要求。

我们主要关心的是为每个记录的事件保留本地时间,但不会失去比较和排序从不同时区生成的事件的能力,因此具有不同的时间偏移量。

我们已经考虑了datetimeoffset数据类型,因为它存储了时间偏移,并且因为它很好地映射到了 .NET 的DateTimeOffset. 但是,SQL Server Compact 4 不支持它。另一种方法是从数据库中删除偏移信息并使用简单的datetime数据类型,以便数据库中的每条数据都被规范化,并且 Compact 的问题更少。然而,这引入了一个问题,即在用户看到数据之前,需要在检索时以某种方式重建偏移信息。

所以我的问题是,是否有关于如何在 SQL Server 中存储日期/时间值的最佳实践或指南,考虑到我们需要处理不同的时区,并使 2008 R2 和 Compact 4 之间的互操作性变得简单尽可能?

谢谢你。

4

3 回答 3

5

听起来相关点是:

  • 您的传入数据非常适合DateTimeOffset
  • 您只关心该特定时间的偏移量,因此您不需要实时时区。(偏移量不是时区。)
  • 确实关心原始偏移量 - 您不能将所有内容标准化为 UTC 并完全忽略偏移量。
  • 您想查询当地时间

在这种情况下,它听起来DateTimeOffset基本上是最合适的类型。您应该确保团队中的每个人都清楚这意味着什么 - 偏移量是最初接收数据时的偏移量。如果您想在不同的时区显示该时刻,您实际上需要返回 UTC,并找出该显示时区中的偏移量。很容易对这种事情感到困惑:)

如果您需要在 SqlServerCE 中完全保真地维护数据,您可能需要一个 DateTime 字段,然后是一个单独的偏移量字段(例如,以分钟为单位,或者如果 SqlServerCE 支持,则作为 TimeSpan)。

于 2013-06-27T16:41:17.243 回答
1

DateTimeOffset在服务器上使用可能是正确的。您可能还想阅读我对DateTime 与 DateTimeOffset的回答。

在使用 SQLCE 的客户端上,将 aDateTime与 UTC 值一起存储。当您将数据发送到服务器时,您可以使用客户端的本地时区来确定DateTimeOffsetUTC 值对应的时间。

如果用户可能正在更改他们的时区,那么您可能还需要将时区的 id 存储在客户端数据库中。但是你只会在转换过程中使用它。除非您可能在服务器或其他客户端上编辑这些值,否则无需将其发送到服务器。

不要尝试将客户端的时间存储在客户端的本地时间中。你会遇到歧义。例如,当夏令时倒退时,您不希望同一本地时间出现两个不同的可能 UTC 时间。

于 2013-06-27T17:02:04.747 回答
0

为什么不使用 datetime 并始终将值存储为 UTC 值,然后您可以在需要时将其格式化为最终用户(显示)时区。

于 2013-06-27T12:59:33.887 回答