【发布时间】:2012-11-23 10:30:20
【问题描述】:
我的情况是我们将数据存储在SQL Server 数据库中,支持2005 年起。存储 DateTime 值时,它是客户端的本地时间。我需要能够在任何地方的任何其他客户端上获取该日期,而不考虑其他客户端可能位于的任何时区。
因此,例如,当纽约的用户输入“2012-12-20 00:00”的 DateTime 值时,我希望加利福尼亚的用户看到相同的 DateTime 值。这些 DateTime 值不应该尊重时区的差异,但这就是我看到的情况。目前,SQL Server 会将 DateTime 作为“2012-12-19 21:00”交付给加利福尼亚用户。请注意由于从 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)),
我们有一个 Sql 类来完成这项工作,在下面的示例中,“sql”是该类的一个对象。使用参数化查询进行调用,其中@data0 是要存储在 SQL DateTime 字段中的 DateTime 对象:
sql.Execute(@"INSERT INTO tblMeterReadings (fldMeterID, fldDateOfReading) VALUES (" + MeterID + ", @data0)", Date);
最终,这会设置一个 SqlCommand,分配参数,并触发一个 command.ExecuteNonQuery() 调用。
现在,要检索日期,我只需将其选择到 DataTable 中(同样,使用我们的 Sql 类助手):
DataTable myTable = sql.readDataTable(@"SELECT fldMeterID, fldDateOfReading FROM tblMeterReadings");
所以我看到的是,在数据库本身中,日期是“2012-12-20 00:00”,正如我所料,但是当我在调试中检查 myTable 内容时,我看到该表中的日期是"2012-12-19 21:00"。
数据库是在 SQL Server 上创建的,该 SQL Server 运行在处于 EST 状态的机器上。但是,我的机器设置为 PST。因此,在 SELECT 中将 DateTime 值传递给我的方式有所不同。
我错过了什么?
【问题讨论】:
-
如何将日期写入数据库?您的问题应该通过简单地从日期时间中删除时区信息来解决,然后再将其保存到数据库中。
-
@DanielHilgarth - 如果您的意思是将其存储为 UTC,那么我会同意。但是已经有很多数据了,在我们能够通过大规模转换之前,我只能试着按我的方式按摩它。
-
除了发布您的代码,正如其他人建议的那样,您应该给出存储日期时间值的表的定义。
-
@DonBoitnott:我并不是说将其存储为 UTC。对于 NY 和 CA,这仍然会有所不同。我的意思是存储它没有时区信息,因为那是你想要的。
标签: c# sql-server datetime timezone