2009-11-05 3 views
0

SQL Server 2005에서 모든 날짜를 GetUtcDate()로 저장하면이 날짜 필드를 검색하는 가장 좋은 방법은 무엇입니까? 나는 C#을 사용하여 사용자가 제출 한 날짜를 C# (Stored Proc에 전달)을 사용하여 UTC로 변환하여 SQL에서 날짜를 검색해야합니까?변환/검색 GETUTCDATE()

나는 UTC를 사용하고 있기 때문에 낮 절약에 대해 걱정할 필요가 있습니까? 사용자 /보기에 날짜/시간을 표시하려면 오프셋을 더하거나 뺍니까? 내 UTC 날짜/시간을 데이터베이스에서 사용자 시간대로 변환 할 때주의해야 할 점이 있습니까?

답변

1

시간대를 처리하는 것이 @ $$에서 큰 고통입니다. 한 가지 고려해야 할 점은 Windows는 역사적인 규칙이 아닌 현재 DST 규칙 만 저장한다는 것입니다. 따라서 규칙을 사용하여 이전 값을 정확하게 다시 작성할 수 있으면 데이터에 약간의 불일치가있을 수 있습니다. DST 규칙은 항상 변경됩니다. 일부 국가는 규칙을 설정하지 않았으며 매년 날짜를 발표합니다.

데이터에 불일치가 있으면 시간대 정보가 인코딩 된 문자열로 날짜를 저장하는 것이 좋습니다. .Net에서 DateTime.ToString ("O")을 사용할 수 있습니다. 당신은 항상 상관없이 코드가 실행되는 것을 문화 같은 포맷을 취득하지 않게이 형식은 문화 불가지론이다.

var origDt = DateTime.Now; 
var dtStr = origDt.ToString("O"); 
var newDt = DateTime.Parse(dtStr, null, System.Globalization.DateTimeStyles.RoundtripKind); 
Console.WriteLine(dtStr); 
if (newDt == origDt) 
    Console.WriteLine("Dates equal"); // should be true 
else 
    Console.WriteLine("Dates not equal"); 

체크 아웃이 형식 스타일에 대한 자세한 내용은 MSDN documentation.

물론 이것은 비용이 든다. 날짜별로 데이터베이스를 검색하는 것은 비효율적입니다 (수행 할 수 있지만 문자열은 날짜로 변환해야 함). 시간대 차이가 너무 중요하지 않을 가능성이 있습니다. 그것은 당신이 데이터로 무엇을하는지 그리고 정확도가 얼마나 중요한지에 달려 있습니다.

이 경로를 사용하기 전에 프로젝트에 실제로 UTC 및 표준 시간대가 있어야합니다. 로컬 컴퓨터에서 시간을 저장하고 시간대를 무시하는 것이 좋을 것입니다.

+0

분명히 2 개의 필드로 저장하는 것이 좋습니다. - DateTime과 시간대를 별도의 char 필드로 사용하십시오. – Mark

+0

현지 시간을 저장하는 방법을 살펴 보겠습니다. 내 요구가 복잡 해지는 것 같아. 도움과 정보를 제공해 주셔서 감사합니다! –

1

"SQL에서 내 날짜를 검색하기 위해 C# (저장 프로 시저에 전달)을 사용하여 사용자가 제출 한 날짜를 UTC로 변환해야합니까?" - 좋은 생각 같아요.

"UTC를 사용하고 있기 때문에 낮 절약에 대해 걱정할 필요가 있습니까?" - 아니요, C#은 로컬과 UTC 시간 사이에 변환 할 때이를 처리합니다.

오프셋을 더하기/빼기 만하지 말고 C# DateTime 함수를 사용하여 UTC와 현지 시간을 변환하십시오. 그렇게하면 DST가 처리됩니다.

관련 문제