Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 在SQL Server 2008 R2和SQL Server Compact 4中存储日期/时间数据的最佳方法_Sql Server 2008_Timezone_Sql Server Ce_Datetimeoffset - Fatal编程技术网

Sql server 2008 在SQL Server 2008 R2和SQL Server Compact 4中存储日期/时间数据的最佳方法

Sql server 2008 在SQL Server 2008 R2和SQL Server Compact 4中存储日期/时间数据的最佳方法,sql-server-2008,timezone,sql-server-ce,datetimeoffset,Sql Server 2008,Timezone,Sql Server Ce,Datetimeoffset,我们正在用C#4开发一个应用程序,它使用SQL Server 2008 R2作为后端。SQL Server Compact 4还用于极少数情况下断开连接的客户端。我们想知道将日期/时间数据存储到这些数据库中的最佳方式是什么,以便: 包含不同时间偏移(来自不同时区)的数据可以很好地共存。这意味着要进行分类和比较 SQL Server 2008 R2和SQL Server Compact 4中的数据可以无缝地来回传输;这是第二个要求,不应影响所选设计 我们主要关注的是为每个记录的事件保留本地时间,但

我们正在用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 4之间的互操作性,是否有关于如何在SQL Server中存储日期/时间值的最佳做法或指导原则


    谢谢。

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

    听起来相关点如下:

    • 您输入的数据非常适合
      DateTimeOffset
    • 您只关心该特定时间的偏移量,因此不需要实时时区。(偏移量不是时区。)
    • 您确实关心原始偏移量—您不能将所有内容正常化为UTC,而完全忽略偏移量
    • 您想查询当地时间
    在这种情况下,
    DateTimeOffset
    基本上是最合适的类型。您应该确保团队中的每个人都清楚这意味着什么-偏移量是最初收到数据时的偏移量。如果您想在不同的时区显示该时刻,实际上需要返回UTC,并找出该显示时区中的偏移量。这类事情很容易让人困惑:)


    如果您需要在SqlServerCE中以完全逼真的方式维护数据,您可能需要一个DateTime字段,然后为偏移量使用一个单独的字段(例如,以分钟为单位,或者如果SqlServerCE支持,则作为时间跨度)。

    在服务器上使用
    DateTimeOffset
    可能是正确的。你可能还想看看我的答案

    在使用SQLCE的客户端上,使用UTC值存储
    DateTime
    。将数据发送到服务器时,可以使用客户端的本地时区来确定UTC值对应的
    DateTimeOffset

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


    不要尝试将客户机上的时间存储在客户机的本地时间。你会遇到一些困难。例如,当夏令时向后滚动时,您不希望同一本地时间有两个不同的UTC时间。

    好吧,我宁愿避免复制后端已经实现的东西。SQL Server和.NET显然使用DateTimeOffset数据类型为您管理时区。正如您所建议的,如果有明显的好处,我只会恢复手动管理它们。好吧,SQLCE只支持datetime,所以唯一的其他选项是使用以下格式将datetime值存储在nchar(34)列中:dto.ToString(“yyyy-MM-dd-HH:MM:ss.fffffff-zzz”,System.Globalization.CultureInfo.InvariantCulture);-)毫无疑问,SQLCE不支持datetimeoffset这一事实是一个很好的理由,可以采用全日期时间解决方案,并按照您的建议将偏移量存储在其他位置。但我想探索更多的选项,并对每个选项的优缺点有一些见解。请注意,datetimeoffset并不真正存储时区,它只存储一个偏移量。这并不能告诉您观测到的时区,即10分钟后的当地时间是多少,此时偏移量可能已经改变。这些值代表什么?只是时间的瞬间?从根本上说,你是需要保持原始偏移量,还是只对某件事发生的那一刻感兴趣?@JonSkeet:你说得对;我必须承认我没有这样看。我们有兴趣知道事件的当地时间,但也需要能够将每个事件的时间与可能在不同地点产生的其他事件进行比较,因此,在不同的时区下(因此具有不同的偏移量)。好的-如果您确实需要当地时间,然后需要以某种方式存储偏移量。接下来,您需要考虑是否需要能够在本地时间查询此数据-例如,您可以将日期时间值存储在UTC中,并将偏移量存储在单独的列中。。。这将使全局排序变得容易,但在本地搜索相对困难…@JonSkeet:我们宁愿优化本地时间,而不是全局比较/排序。也许在loc中存储日期时间