2014-03-04 121 views
4

我想將sql server datetime轉換爲毫秒。我試圖把它與如下DATEDIFF函數轉換:將Sql Server DateTime轉換爲1970年以來的毫秒

select cast(Datediff(ms, '1970-01-01',GETUTCDATE()) AS bigint) 

但它給我這個錯誤:

消息535,級別16,狀態0,2號線 DateDiff函數導致溢出。分隔兩個日期/時間實例的日期部分數量太大。嘗試使用不精確的日期部分的datediff。

我不想做這樣的:

select cast(Datediff(minute, '1970-01-01',GETUTCDATE()) AS bigint)*60*1000 

因爲它不會給我準確的結果。有人可以幫助我嗎?

+0

你仍然不知道你是否得到了足夠的接受有效的答案嗎? – Kangkan

+0

Oracle SQL版本:http://stackoverflow.com/q/31652232/435605 –

回答

4

你確定你需要它達到毫秒(千分之一秒)嗎?

注意1天= 86,400,000ms(是86.4萬美元)

1年=約31.6十億毫秒。

1970年(截至今天)44年前,所以大約是1.4萬億毫秒前。

當然,一個BIGINT可以處理它,不幸的是你還打DATEDIFF的限制,這裏是從文檔報價:

If the return value is out of range for int (-2,147,483,648 to +2,147,483,647), an error is returned. For millisecond, the maximum difference between startdate and enddate is 24 days, 20 hours, 31 minutes and 23.647 seconds. For second, the maximum difference is 68 years.

所以,你的安全得到以秒之差了一會(只要你不走太遠的將來),然後你可以從今天開始,例如數毫秒:

SELECT 
    CAST(DATEDIFF(second, '1970-01-01', CAST(GetUtcDate() AS date)) AS bigint) 
    AS [SecondsToStartOfDay], 
    DATEDIFF(ms, CAST(GetUtcDate() AS date), GetUtcDate()) 
    AS [MillisecondsSinceStartOfDay], 
    (CAST(DATEDIFF(second, '1970-01-01', CAST(GetUtcDate() AS date)) AS bigint)*1000) 
    + DATEDIFF(ms, CAST(GetUtcDate() AS date), GetUtcDate()) 
    AS [Milliseconds] 

前兩列都只是爲了顯示涉及的步驟。

+1

對日期函數的不同調用可能會返回不同的結果,這意味着如果在午夜運行,此答案可以24小時結束。 –

+1

'GetUtcDate()'的當前值可以保存到一個變量中,如果這是一個問題,則可以重用。 –

+0

我怎樣才能得到像這樣的'1459881000000'只有以毫秒爲單位的日期,你可以檢查在這個網站上的日期https://currentmillis.com/ – Ajinkya

1

這是一個Microsoft SQL函數,返回以毫秒爲單位的UTC時間(毫秒自1970年以來),其結果等於Java.currentTimeMillis()

CREATE FUNCTION dbo.currentTimeMilliseconds() 
    RETURNS BIGINT 
    WITH EXECUTE AS CALLER 
AS 
    BEGIN 

    DECLARE @t datetime = CONVERT (datetime, GETUTCDATE()); 
    DECLARE @days BIGINT = Datediff(day, '1970-01-01',@t); 
    DECLARE @t_hours BIGINT = DATEPART(HOUR, @t); 
    DECLARE @t_minuts BIGINT = DATEPART(MINUTE, @t); 
    DECLARE @t_seconds BIGINT = DATEPART(SECOND, @t); 
    DECLARE @t_miliseconds BIGINT = DATEPART(MILLISECOND, @t); 

    RETURN @days * 1000 * 60 * 60 * 24 + @t_hours * 60 *60 *1000 + @t_minuts * 60 * 1000 + @t_seconds * 1000 + @t_miliseconds; 
    END 
GO 
0

有了這個查詢,你可以得到的日期時間爲毫秒自1970年以來

SELECT CAST(Datediff(s, '1970-01-01', GETUTCDATE()) AS BIGINT)*1000 
相關問題