La mia situazione è che memorizziamo dati in un database SQL Server, supportando il 2005 in su. Quando un valore DateTime è memorizzato, è nell'ora locale del client. Devo essere in grado di riportare quella data su qualsiasi altro client, ovunque, senza rispettare il fuso orario in cui potrebbe trovarsi l'altro client.Come posso ottenere dati DateTime da SQL Server ignorando i problemi relativi al fuso orario?
Quindi, ad esempio, quando un utente di New York immette un valore DateTime di " 2012-12-20 00:00 ", voglio che l'utente in California visualizzi lo stesso valore DateTime. Questi valori DateTime non dovrebbero rispettare la differenza nei fusi orari, ma è quello che vedo accadere. Attualmente, SQL Server consegnerà tale DateTime all'utente California come "2012-12-19 21:00". Si noti come è ora il giorno precedente a causa del rollback di -3 ore a causa del passaggio da EST a PST (dimenticare i problemi di ora legale per gli scopi di questa conversazione).
Ripristinare i dati restituiti alla lettera e non tradotti dal fuso orario, è ciò che devo realizzare. Quindi quale consiglio puoi offrire?
Alcuni codice da considerare:
Ecco la tabella:
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)),
Abbiamo una classe di SQL che fa il lavoro, e nel seguente esempio "sql" è un oggetto di tale classe. La chiamata viene effettuata utilizzando una query con parametri dove @ data0 è l'oggetto DateTime per memorizzare in un campo DateTime SQL:
sql.Execute(@"INSERT INTO tblMeterReadings (fldMeterID, fldDateOfReading) VALUES (" + MeterID + ", @data0)", Date);
definitiva, questo configura uno SqlCommand, assegna parametri e spara una chiamata command.ExecuteNonQuery() .
Ora, per recuperare la data, ho semplicemente selezionare in un DataTable (ancora una volta, utilizzando la nostra classe Sql helper):
DataTable myTable = sql.readDataTable(@"SELECT fldMeterID, fldDateOfReading FROM tblMeterReadings");
Quindi quello che vedo è che nel database stesso, la data è " 2012-12-20 00:00 "come mi aspetto, ma quando controllo i contenuti di myTable in debug, vedo che la data in quella tabella è" 2012-12-19 21:00 ".
Il database è stato creato su un server SQL eseguito su una macchina in uno stato EST. La mia macchina, tuttavia, è impostata su PST. Da qui la differenza nel modo in cui il valore DateTime mi viene consegnato nella SELECT.
Cosa mi manca?
Correlati: http://stackoverflow.com/q/2532729/1583 – Oded
Come si scrive la data nel database? Il problema dovrebbe essere risolto semplicemente eliminando le informazioni sul fuso orario dal datetime prima di salvarlo nel database. –
@DanielHilgarth - E se con questo intendi memorizzarlo come UTC, allora sarei d'accordo. Ma ci sono già molti dati e fino a quando non riusciremo a superare una conversione massiccia, mi lascerò tentare di massaggiarlo come ho fatto io. – DonBoitnott