Datetime SQL数据库、日期类型和时区(ADO.NET)

Datetime SQL数据库、日期类型和时区(ADO.NET),datetime,ado.net,Datetime,Ado.net,我们遇到了这样一个问题:进行select查询的程序位于一个时区,数据库位于另一个时区,并且日期比较包括额外的一天。我猜这是因为说@date

我们遇到了这样一个问题:进行select查询的程序位于一个时区,数据库位于另一个时区,并且日期比较包括额外的一天。我猜这是因为说@date<'2013-01-04',其中@date在英国被设置为一个参数,但在美国是一个数据库,因为时区不同,时间偏移部分将其移动到第二天

数据库中的DateTime基本上是一个整数或long。那么,当数据库的日期列值为2013-01-04T00:00:00时,ADO.NET是如何工作的?该值是存储为UTC日期时间、本地日期时间还是特定的偏移量

当我用DateTime Kind==Local设置这个参数时,它是如何转换的


谢谢-dave取决于数据库。但如果说所有数据库都像dotnet或javascript那样将日期时间存储为一个整数,那肯定是错误的。您没有在问题中指定您使用的数据库产品,但SQL Server(例如)使用了两个整数:

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


第二部分,时间部分在内部也是一个整数,表示自午夜以来的时钟滴答数。看见时钟滴答声为1/300秒,约为3.333毫秒

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

它不会指定时区


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

是,但。。。自1月1日起的天数和秒数在哪里?在英格兰,0的值在科罗拉多州是一个负数。