【问题标题】:SQL databases, Date type, and timezones (ADO.NET)SQL 数据库、日期类型和时区 (ADO.NET)
【发布时间】:2013-11-09 02:45:30
【问题描述】:

我们遇到了一个问题,其中进行选择查询的程序位于一个时区,数据库位于另一个时区,并且日期比较包含额外的一天。我猜这是因为说@date

数据库中的 DateTime 基本上是一个整数(或长整数)。那么当数据库的日期列值为 2013-01-04T00:00:00 时,这如何与 ADO.NET 一起工作 - 是存储为 UTC 日期时间、本地日期时间(无论本地偏移量恰好在那个点) ,还是特定的偏移量?

当我使用 DateTime (Kind == Local) 设置该参数时,它是如何转换的?

谢谢 - 戴夫

【问题讨论】:

    标签: datetime ado.net


    【解决方案1】:

    取决于数据库。但是,如果说所有数据库都将日期时间存储为一个整数(就像 dot Net 或 javascript 一样),那肯定是不正确的。您没有在问题中指定您使用的是哪个数据库产品,但 SQL Server 例如使用 两个 整数:

    SQL Server 对 datetime 和 smalldatetime 值的内部表示是一个由两部分组成的值,其中第一部分是一个整数,表示自 1900 年 1 月 1 日以来的天数,第二部分是一个小数部分,表示一天的小数部分(当时)--- 所以整数值 0(零)总是直接转换为 1900 年 1 月 1 日的午夜早晨。

    第二部分,时间部分在内部也是一个整数,表示从午夜开始的时钟滴答数。见this。时钟滴答是 1/300 秒,大约 3.333 毫秒。

    【讨论】:

    • 是但是... 自 1 月 1 日以来的天数和秒数在哪里?英格兰的 0 值在科罗拉多州是负数。
    【解决方案2】:

    如果您存储 .NET DateTime,它在数据库中的值始终与 .ToString() 相同

    它不会指定时区。

    我建议您在将它们存储到数据库之前在所有日期时间使用.ToUniversalTime(),并在读取它们时假设所有时间都是UTC。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2013-12-17
      • 1970-01-01
      • 2017-06-30
      相关资源
      最近更新 更多