2012-12-05 1 views
5

제 상황은 2005 년을 지원하는 SQL Server 데이터베이스에 데이터를 저장한다는 것입니다. DateTime 값이 저장되면 클라이언트의 로컬 시간입니다. 다른 클라이언트가있을 수있는 시간대에 관계없이 다른 클라이언트에서 날짜를 다시 가져올 수 있어야합니다.표준 시간대 문제를 무시하고 SQL Server에서 DateTime 데이터를 가져 오는 방법은 무엇입니까?

예를 들어 New York의 사용자가 DateTime 값을 " 2012-12-20 00:00 ", 캘리포니아의 사용자가 동일한 DateTime 값을 보길 원합니다. 이 DateTime 값은 시간대의 차이를 고려해서는 안되지만 그게 내가보고있는 것입니다. 현재 SQL Server는 해당 DateTime을 캘리포니아 사용자에게 "2012-12-19 21:00"으로 제공합니다. EST에서 PST 로의 변경으로 인해 -3 시간 롤백으로 인해 전날의 상황을 알 수 있습니다 (이 대화의 목적 상 DST 문제는 잊어 버립니다).

데이터를 역방향으로 가져오고 표준 시간대로 변환하지 않은 것이 내가 달성해야하는 것입니다. 그렇다면 어떤 조언을 제공 할 수 있습니까?

일부 코드는 고려해야 할 다음

테이블입니다 : 우리는 작업을 수행하여 SQL 클래스가

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은"그의 목적은 수업. 이 호출은 @의 DATA0는 DateTime 개체는 SQL 날짜 시간 필드에 저장하는 매개 변수가있는 쿼리를 사용한다 :

sql.Execute(@"INSERT INTO tblMeterReadings (fldMeterID, fldDateOfReading) VALUES (" + MeterID + ", @data0)", Date); 

궁극적으로,이,하는 SqlCommand를 설정 매개 변수를 할당을하고, command.ExecuteNonQuery() 호출을 발사 .

DataTable myTable = sql.readDataTable(@"SELECT fldMeterID, fldDateOfReading FROM tblMeterReadings"); 

그래서 내가 볼 것은 데이터베이스 자체에 날짜 "라는 것이다 : 이제

는 날짜를 검색하려면, 단순히 (우리는 SQL 클래스 헬퍼를 사용하여 다시) DataTable을로 선택 2012-12-20 00:00 "으로 예상했지만 디버그에서 MyTable 내용을 검사하면 해당 테이블의 날짜가"2012-12-19 21:00 "임을 알 수 있습니다.

데이터베이스가 EST 상태의 시스템에서 실행되는 SQL Server에서 작성되었습니다. 그러나 내 컴퓨터는 PST로 설정됩니다. 따라서 SELECT에서 나에게 DateTime 값이 전달되는 방식의 차이.

무엇이 누락 되었습니까?

+0

관련 항목 : http://stackoverflow.com/q/2532729/1583 – Oded

+0

어떻게 날짜를 데이터베이스에 쓰고 있습니까? 문제는 데이터베이스에 저장하기 전에 datetime에서 표준 시간대 정보를 간단히 제거하여 해결해야합니다. –

+0

@DanielHilgarth - 그리고 그걸로 UTC로 저장한다면, 나는 동의 할 것입니다. 그러나 이미 많은 데이터가 있습니다. 그리고 엄청난 전환이 일어날 때까지 나는 그것을 가지고있는 것처럼 그것을 마사지하려고 노력하고 있습니다. – DonBoitnott

답변

2

여러분의 의견을 잘 듣고 제안 사항에 대한 조사를 해 주셔서 감사 드리며 문제를 해결했습니다.

도움에 대한 ebyrob에 대한 특별 감사와이 링크 : http://support.microsoft.com/kb/842545

그 링크는 궁극적으로 은색 총알 것으로 판명.

기본적으로 DataTable 또는 DataSet을 구성 할 때 생성되는 표준 시간대에 대한 정보가 함께 인코딩됩니다. 그런 다음 다른 표준 시간대 내에있는 컴퓨터에 연결을 통해 해당 개체를 전달하면 해당 표준 시간대의 모든 DateTime 값이 표준 시간대의 차이에 따라 조정됩니다.

이러한 이해를 바탕으로 모든 DateTime DataColumns의 DateTimeMode 속성을 DataSetDateTime.Unspecified으로 설정하는 것이 수정되었습니다. 이렇게하면 직렬화 이후 날짜 조정을 방지하고 대신 DateTime 값을 그대로 전달합니다.

또한이 기사에서 DataSet을 지정하고 있지만 DataTable의 취약성도 입증되었음을 지적하고자합니다. 사실, DataColumn 그 자체 (DateTime 유형의 어쨌든)에 대해서는 확실히 확신합니다. 나는 기사가 이것을 또한 진술한다라고 생각한다.

다시 감사드립니다. 나는 우리가 지금 그것을 가지고 있다고 생각한다!

+0

조사 결과를 게시 해 주셔서 감사합니다. –

2

데이터베이스에 UTC 날짜를 저장하십시오. 클라이언트에 표시 할 때만 현지 시간으로 변환하십시오.

서버 쪽에서는 getdate() 대신 getutcdate()을 사용하십시오.

DateTime dtDateOfReading = TimeZoneInfo.ConvertTime(
    Convert.ToDateTime(myTables.Rows[i]["fldDateOfReading"]), 
    dtTimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time") 
    ); 

당신이, 당신이 시간 - 저장해야합니다에서 일을 보려는 하나 개 이상의 시간대가있는 경우 :

+1

전적으로 동의합니다. 불행히도, 가까운 장래에 가능하지 않습니다. 사실, 일부 고객은 이미 20 년 이상 데이터를 보유하고 있습니다. Access 데이터베이스에서 우리가 항상 "빠져 나갔다"는 사실에서 비롯된 것이고, 최근에 SQL Server로 옮겨 가면서 이러한 약점이 드러났습니다. – DonBoitnott

1

외부에서 당신은 당신이 할 수있는 특정 시간대에 날짜를 표시 할 존은 어느 날짜 또는 어느 고객 사이트와 함께 지낼지를 결정합니다.

참고 : 변환 된 DateTime 값은 일부 경우 로컬 인 것으로 가정 될 수있는 종류가 지정되지 않았으므로주의해야합니다.

EDIT : SQL 연결의 표준 시간대를 SQL Server의 표준 시간대와 동일하게 설정하는 것이 더 쉽지만이 문서에서는 http://support.microsoft.com/kb/842545이 SqlDataAdapter에서 표준 시간대 구성을 지원하지 않을 수 있음을 나타냅니다.

+0

나는 이것을 고려했다. 그러나이 접근 방식은 DateTime 값이 생성 된 시간대에 대한 정보를 알고 있다고 가정하지 않습니까? 내보기가 이것을 제안 할 수도 있지만 사실이 아닙니다. 나는 단순히 DateTime을 가지고 있지만, 그것에 대해 아무것도 모른다고 가정해야합니다. 사실, 나는 상관하지 않습니다. 데이터베이스에 "2012-12-20 00:00"으로 표시되면 원하는대로 시간대가없는 것처럼 보입니다. – DonBoitnott

+0

SQL 서버의 표준 시간대는 EST입니다. 또한 고객 NYSEG의 모든 시간이 예를 들어 EST에 있음을 알 수 있습니다. (나는 당신이 실제로 서버 시간대의 차이점을 개별 레코드 시간대가 아닌 여기에서보고 있다고 생각합니다 ...) –

+0

편집에 명시된 바와 같이 "SQL 연결에 대한 표준 시간대 설정"방법에 대해 약간 살펴 보았습니다. 나는 어떻게 생각해. 나에게 페이지를 가르키거나 샘플 코드 줄을 제공 할 수 있습니까? BTW : 기술 자료 기사는 좋은 읽을 거리이며, 내가 생각하기에, 내가 직면 한 근본적인 문제라고 생각합니다. – DonBoitnott

관련 문제