2012-09-21 11 views
17

SQL 서버에서 UTC 밀리 초를 DateTime으로 변환하고 싶습니다. SQL 서버에서 UTC 밀리 초를 DATETIME으로 변환합니다.

쉽게 다음 코드로 C#으로 수행 할 수 있습니다

DateTime startDate = new DateTime(1970, 1, 1).AddMilliseconds(1348203320000); 

내가 SQL 서버에서이 작업을 수행해야합니다. here이라는 스크립트를 발견했으나 1900-01-01에서 초기 틱을 가져 왔습니다.

나는 아래와 같은 DATEADD 기능을 사용하고 있지만,이 차이로 밀리 초 supping하여 산술 오버플로 예외를주고 있었다 :

SELECT DATEADD(MILLISECOND,1348203320000,'1970-1-1') 

가 어떻게 제대로 변환을 할 수 있습니까?

답변

33
DECLARE @UTC BIGINT 
SET @UTC = 1348203320997 

SELECT DATEADD(MILLISECOND, @UTC % 1000, DATEADD(SECOND, @UTC/1000, '19700101')) 
3

DATEADD에는 두 번째 인수로 정수가 필요합니다. 귀하의 전화 번호 1348203320000은 정수 값이 매우 커서 런타임에 오류가 발생합니다. 대신 bigint 유형을 사용해야하며 DATEADD에 밀리 초를 초와 밀리 초로 나눠서 올바른 int 값을 제공해야합니다. 그것이 당신이 사용할 수있는 견본입니다. -

DECLARE @total bigint = 1348203320000; 

DECLARE @seconds int = @total/1000 
DECLARE @milliseconds int = @total % 1000; 

DECLARE @result datetime = '1970-1-1'; 
SET @result = DATEADD(SECOND, @seconds,@result); 
SET @result = DATEADD(MILLISECOND, @milliseconds,@result); 
SELECT @result 
1

내가 여기 주어진 답을 사용하여 문제가 있었다 (시스템이 틱 폼 0001-01-01 계산되었다 특히 있음) 그래서 나는이 한 : 함수 아래

CONVERT(DATETIME,[Time]/ 10000.0/1000/86400-693595) 

--explanation for [Time_in_Ticks]/ 10000.0/1000/86400-693595 
--Time is in "ticks" 
--10000 = number of ticks in Milisecond 
--1000 = number of milisecons in second 
--86400 = number of seconds in a day (24hours*60minutes*60second) 
--693595= number of days between 0001-01-01 and 1900-01-01 (which is base 
--   date when converting from int to datetime) 
2

을 그 날짜

에 밀리 초를 변환
IF object_id('dbo.toDbTimeMSC', 'FN') IS NOT NULL DROP FUNCTION dbo.toDbTimeMSC 
GO 
CREATE FUNCTION [dbo].[toDbTimeMSC] (@unixTimeMSC BIGINT) RETURNS DATETIME 
BEGIN 
    RETURN DATEADD(MILLISECOND, @unixTimeMSC % 1000, DATEADD(SECOND, @unixTimeMSC/1000, '19700101')) 
END 
GO 

- (1348203320000)

을 dbo.toDbTimeMSC을 선택
-1

SQL Server 2008 R2를 사용하면 다음과 같은 결과가 나타납니다.

CAST(SWITCHOFFSET(CAST(dateadd(s, convert(bigint, [t_stamp])/1000, convert(datetime, '1-1-1970 00:00:00')) AS DATETIMEOFFSET), DATENAME (TZoffset, SYSDATETIMEOFFSET())) AS DATETIME) 
관련 문제