如何从SQL Server中获取DateTime数据而忽略时区问题?

Don*_*ott 5 c# sql-server timezone datetime

我的情况是我们将数据存储在SQL Server数据库中,支持2005年.存储DateTime值时,它位于客户端的本地时间.我需要能够在任何地方的任何其他客户端上获取该日期,而不考虑其他客户端可能处于的任何时区.

因此,例如,当纽约的用户输入DateTime值"2012-12-20 00:00"时,我希望加利福尼亚的用户看到相同的DateTime值.这些DateTime值不应该尊重时区的差异,但这就是我看到的情况.目前,SQL Server将该DateTime作为"2012-12-19 21:00"提供给California用户.请注意,由于从EST到PST的变化导致-3小时回滚,所以现在是前一天(为此对话而忘记DST问题).

我需要完成的是逐字逐句地获取数据,而不是按时区翻译.那么你能提供什么建议?

一些代码需要考虑:

这是表格:

CREATE TABLE [dbo].[tblMeterReadings](
[fldMeterReadingsID] [int] IDENTITY(1,1) NOT NULL,
[fldMeterID] [int] NOT NULL,
[fldUser] [varchar](50) NULL,
[fldBy] [varchar](50) NULL,
[fldDateOfReading] [datetime] NULL,
[fldReading] [float] NULL,
[fldIsArchived] [bit] NULL DEFAULT ((0)),
Run Code Online (Sandbox Code Playgroud)

我们有一个Sql类来完成工作,在下面的例子中,"sql"是该类的一个对象.使用参数化查询进行调用,其中@ data0是要存储在SQL DateTime字段中的DateTime对象:

sql.Execute(@"INSERT INTO tblMeterReadings (fldMeterID, fldDateOfReading) VALUES (" + MeterID + ", @data0)", Date);
Run Code Online (Sandbox Code Playgroud)

最终,这将设置一个SqlCommand,分配参数,并触发command.ExecuteNonQuery()调用.

现在,要检索日期,我只需将其选择为DataTable(再次使用我们的Sql类助手):

DataTable myTable = sql.readDataTable(@"SELECT fldMeterID, fldDateOfReading FROM tblMeterReadings");
Run Code Online (Sandbox Code Playgroud)

所以我看到的是,在数据库本身,日期是"2012-12-20 00:00",正如我所料,但是当我在调试中检查myTable内容时,我看到该表中的日期是"2012- 12-19 21:00".

数据库是在运行于EST状态的计算机上的SQL Server上创建的.但是,我的机器设置为PST.因此,在SELECT中如何将DateTime值传递给我.

我错过了什么?

Don*_*ott 2

感谢各位好心人的意见,以及根据你们的建议进行的一些研究,我们已经解决了我们的问题。

特别感谢ebyrob的帮助和此链接: http://support.microsoft.com/kb/842545

这一联系最终被证明是灵丹妙药。

根本问题是,当您构造 DataTable 或 DataSet 时,有关创建它的时区的信息会随之编码。然后,如果您通过连接将该对象传递到位于不同时区的计算机,则其中的任何 DateTime 值都将根据时区的差异进行调整。

根据这种理解,修复方法是将DateTimeMode所有 DateTime DataColumn 的属性设置为DataSetDateTime.Unspecified。这可以防止序列化后的日期调整,而是逐字传递日期时间值。

我还想指出,本文指定了 DataSet,但我们已经证明 DataTable 也容易受到攻击。事实上,我非常确定它归结为 DataColumn 本身(无论如何,那些具有 DateTime 类型的数据列)。我想这篇文章也表达了这一点。

再次感谢;我想我们现在已经做到了!