2012-09-21 98 views
17

我想將UTC毫秒轉換爲SQL服務器中的DateTime。將UTC毫秒轉換爲SQL服務器中的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

下面的功能轉換毫秒爲datetime

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 

- 選擇dbo.toDbTimeMSC(1348203320000)

-1

使用SQL Server 2008R2生成所需結果:

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)