원래 질문에 제공된 예제와 비슷한 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())
올바른 결과를 얻으려면 DATEDIFF :'DATEDIFF (hour, GETUTCDATE(), GETDATE())'호출에서 GETDATE()와 GETUTCDATE()를 반대로해야하지만 약 100 번 실행 해 보았습니다. 최소한 적절한 시간을 가졌어. –
죄송합니다. 반품했습니다. 또한 시간 접근 방식이 UTC에서 1/2 시간 오프셋 된 국가를 다루지 않기 때문에 DATEADD (분 ...)를 사용하는 대답을 변경했습니다. – Richard
당신이 제시 한 UDF에 성능상의 불이익이 있는지, 나는 1 행/1 열 결과를 값으로 반환하는 인라인 TVF로 만드는 것이 합리적일까요? –