SQL Server - 在服务器之间导出DateTime值会更改值(时区问题?)

时间:2012-01-04 21:30:00

标签: .net sql-server datetime

以下是导出的工作方式

  1. .NET DataTable由SQL查询
  2. 创建
  3. 数据集被序列化并通过HTTP请求发送给导入程序
  4. 导入程序反序列化并执行一系列插入/更新;每个DataTable行一个
  5. 详情

    • 导出SQL Server位于东部(美国)时区
    • 导入SQL Server位于中央(美国)时区

    问题

    • 日期时间值为1-3-2012 00:00:00东部(东部时间午夜1/3/12)
    • 此值通过前面提到的机制
    • 导出
    • 当它存放到目标(中央)SQL Server时,其值为1-2-2012 23:00:00(前一天晚上11:00)

    日期时间值不应从一台服务器更改为下一台服务器。它需要保持在1-3-2012 00:00:00。

    我尝试了什么?

    • 我已确认重新运行导出后相应的日期值确实已关闭1小时
    • 我已确认我的代码没有减去一小时
      • 通过BinaryFormatter.Serialize函数进行序列化,DataSet本身就在
      • 通过BinaryFormatter.Deserialize函数
      • 进行反序列化
      • 使用DataTable中的每列一个参数调用存储过程。我已通过以下代码确认了日期值的直接副本:CMD.Parameters("@p" & col.ColumnName).Value = row(col.ColumnName)
    • 我已经为DateTime分析了MSDN,但根据我的理解(在前4个字节中存储日期,最后4个字节中的时间),切换到不同的日子,即使是每个4字节的块表示某些基准日或时间的相对偏移量
    • 我已确认DataSet在新时区反序列化的那一刻,所有日期时间都已移动1小时

    这真的感觉像是时区问题,但我无法弄清楚它可能在哪里。

2 个答案:

答案 0 :(得分:1)

通过链接服务器连接上的UPDATE查询将日期时间从一个SQL Server传输到另一个SQL Server将保留日期和时间。尽管时区有所改变,但午夜时分午夜时分仍然是午夜1/3。

但是,通过将日期注入.NET数据集,您可以将SQL DateTime变量置于.NET DateTime的数据转换中。

DateTime的显示因TimeZone而异。如果您通过ToString()函数在加利福尼亚州加载相同的位,就会得到两个不同的结果。

因此,在调用此代码时,损坏已完成

  • CMD.Parameters("@p" & col.ColumnName).Value = row(col.ColumnName)

要解决此问题,您必须确定时区偏移量并调整值,或者序列化为更安全的格式,从而避免使用@competent_tech提及的.NET DateTime。

<强>参考

答案 1 :(得分:0)

尝试一个简单的技巧:将日期序列化为字符串而不是.Net日期时间类型。这将消除任何时区问题。