2011-11-04 2 views
3

오늘날의 자정 시간을 얻기 I이 날짜 시간으로 오늘 자정 값 (UTC)를 계산 다음 쿼리 :은 UTC

결과
SELECT CONVERT(DATE,GETDATE())+(GETDATE()-GETUTCDATE()) 

: 2011-11-03 19:00:00.000 (GMT-5 11 월 4, 2011)

은 그뿐만 아니라, 경우에, 이들과 같은 값을 반환

2011-11-03 19:00:00.003 
2011-11-03 19:00:00.007 
2011-11-03 19:00:00.010 

... 잘못되는!

이렇게하는 더 좋은 방법이 있어야합니다.

답변

3

원래 질문에 제공된 예제와 비슷한 DATEADD 및 DATEDIFF를 GETDATE() 및 GETUTCDATE()와 함께 사용하여 솔루션에 이미 응답했지만 그 이후로 datetimeoffset 데이터 형식 added in SQL Server 2008을 발견했습니다. 이것은 시간대 오프셋과 함께 datetime을 저장합니다.

이 유형을 사용하는 방법은 기존 데이터의 데이터 유형을 변경할지 여부에 따라 달라집니다. 사용 또한 현지 시간으로 어떤 UTC 시간을 변환 할 수

SELECT CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, 
    CONVERT(date, GETDATE())), 
    DATENAME(TzOffset, SYSDATETIMEOFFSET()))) 

: 당신은 아무것도 변경하지 않으려면, 다음 문은 자정 현지 시간으로 날짜 형식을 반환합니다

SELECT CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, 
     @myutctime, 
     DATENAME(TzOffset, SYSDATETIMEOFFSET()))) 

datetimeoffset 형식은 SQL2008 이상에서만 사용할 수 있습니다. 2005 및 아래에서이 작업을 수행해야하는 경우 원래 질문과 비슷한 솔루션을 사용할 수 있지만 GETDATE() - GETUTCDATE()은 원자 적 연산이 아니므로 2 초 사이의 밀리 초가 포함될 가능성이 높습니다 실행됩니다.

SELECT DATEADD(minute, 
    DATEDIFF(minute, GETUTCDATE(), GETDATE()), 
    CONVERT(datetime, CONVERT(date, GETDATE()))) 

GETDATE()GETUTCDATE() 사이의 수 분이 걸릴 로컬 자정 시간에 추가됩니다. 아쉽게도 DATEADD은 날짜를 지정하면 분과 함께 작동하지 않으므로 날짜에서 날짜 시간으로 변환해야합니다. 이것을 사용자 정의 함수로 묶어 덜 자세하게 보이게하는 것이 좋습니다 (예 : 당신이 설명한 것과 같은 특정 시나리오의

CREATE FUNCTION dbo.MidnightASUTC(@dt as datetime) 
RETURNS datetime 
AS 
BEGIN 
    RETURN DATEADD(minute, 
     DATEDIFF(minute, GETUTCDATE(), GETDATE()), 
     CONVERT(datetime, CONVERT(date, @dt))) 
END 

SELECT dbo.MidnightAsUTC(GETDATE()) 
+0

올바른 결과를 얻으려면 DATEDIFF :'DATEDIFF (hour, GETUTCDATE(), GETDATE())'호출에서 GETDATE()와 GETUTCDATE()를 반대로해야하지만 약 100 번 실행 해 보았습니다. 최소한 적절한 시간을 가졌어. –

+0

죄송합니다. 반품했습니다. 또한 시간 접근 방식이 UTC에서 1/2 시간 오프셋 된 국가를 다루지 않기 때문에 DATEADD (분 ...)를 사용하는 대답을 변경했습니다. – Richard

+0

당신이 제시 한 UDF에 성능상의 불이익이 있는지, 나는 1 행/1 열 결과를 값으로 반환하는 인라인 TVF로 만드는 것이 합리적일까요? –

0

는 ("오늘 자정 값이 날짜로 (UTC)은"), 프로그래밍 접근 방식은 의미가 있지만, 혹시 다른 질문을 확장해야하는 경우 (이번 여름 자정 UTC는 무엇 이었습니까?), 일광 절약 시간제 등을 설명하기 위해 달력 표를 사용할 수 있습니다.