2017-04-05 1 views
4

DateTime 필드를 포함하는 C#에서 SqlServer 데이터베이스를 쿼리하면 System.DateTimeKind==Unspecified이 반환됩니다. 이는 SqlServer DateTime 유형이 표준 시간대 정보를 유지하지 않으므로 놀랄 일이 아닙니다.DB에서 DateTime 필드를 쿼리 할 때 DateTimeKind를 제어 할 수 있습니까?

쿼리 결과를 읽은 후 수동으로 변환하지 않고 이러한 값을 로컬 또는 범용으로 자동 읽는 방법이 있는지 궁금해했습니다. 이는 필드를 놓친 경우 실수 가능성을 더 많이 나타냅니다. 같은

전형적인 코드는 같습니다 당신이 당신의 자신의 코드에 검색에 지정할 필요가 데이터베이스에 유지되지는로

using (var conn = ...) 
    using (var command = ...) 
    { 
     conn.Open(); 
     var reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      DateTime dateField = (DateTime)reader["date"]; 
      //dateField.Kind == Unspecified 
     } 
    } 
+2

를 호출 그렇게 할 기본 방법입니다,하지만 당신은 쉽게 '다음 호출 SqlDataReader''에 대한 자신의 확장 메서드를 만들 수 있습니다 reader.GetDateAsLocal ("date")'및'reader.GetDateAsUtc ("date")'. – Evk

+0

DateTime이 SQL 서버에 저장되면 표준 시간대 정보가 저장되지 않습니다. 따라서 검색 할 때 사용할 수 없습니다. DateTime 값이 db에 저장되기 전에 DateTime 값이 UTC로 변환되었는지 또는 DateTimeOffset을 사용하여 Database에 DateTime 값을 저장하는지 확인할 수 있습니다. –

+1

또한 SQL Server에는 'datetimeoffset' 유형이 있습니다.이 유형은 밀리 초가 필요하지 않으면'datetime'과 동일한 * 공간을 사용합니다 ('datetimeoffset2 (0)'). 추측을 피하려면'datetime' 대신'datetimeoffset'을 사용하십시오. '로컬'은 아무 의미도 없습니다 - 누구에게 국부가 있습니까? DB 서버, 웹 서버, 브라우저? 오프셋에서도 모든 문제를 방지하고 싶습니다. DST 규칙이 변경되면 어떻게됩니까? 그게 걱정이라면 IANA 시간대를 저장하고 예를 들어 NodaTime을 사용하여 날짜를 처리하십시오. –

답변

4
DateTime dateField = DateTime.SpecifyKind((DateTime)reader["date"], DateTimeKind.Utc); 

, 당신이 만들 수 있지만 DataReader가에는 바로 가기 방법이 없습니다 Extension 메서드.

public static class Helper{ 
    public static DateTime GetDateTimeAsUtc(this IDataReader reader, string column){ 
     return DateTime.SpecifyKind((DateTime)reader[column], DateTimeKind.Utc); 
    } 
} 

후 지금까지 내가 거기에 알고

DateTime dateField = reader.GetDateTimeAsUtc("date"); 
+1

이것은 정말 좋은 패턴입니다. 그것을 성문화 해 주셔서 감사합니다. +1. –

관련 문제