2010-09-06 132 views
9

請幫我這個, 我想將一個值從Bigint轉換爲datetime。 例如即時閱讀歷史的TeamCity服務器的桌子上,現場build_start_time_server我有一個記錄該值1283174502729.從Bigint轉換爲datetime值

我怎麼能轉換爲datetime值???

謝謝

+0

我改變了標籤,希望讓它們更具體。請注意,如果您在標記字段中使用「sql server」,則該標記將置於* sql *標記以及* server *標記之下,但不在* sql-server *標記之下,這可能是您想要的。 – krock 2010-09-06 09:31:07

+1

你想要什麼日期時間值爲1283174502729? – gbn 2010-09-06 09:42:54

回答

22

這是否適合您?它返回30-8-2010 13點21分42秒在SQL Server 2005上的那一刻:

select dateadd(s, convert(bigint, 1283174502729)/1000, convert(datetime, '1-1-1970 00:00:00')) 

我除以1000,因爲大DATEADD函數不會與一些工作。所以你確實會失去一點精確度,但使用起來要簡單得多。

+1

克洛克,多數民衆贊成是完美的。感謝您的幫助。 – Chris 2010-09-06 09:51:29

+0

@Chris如果這是正確的,你應該接受答案。 – 2010-09-06 10:23:12

2

略有不同的方法:

您的方案:

SELECT dateadd(ms, 1283174502729/86400000, (1283174502729/86400000) + 25567) 
FROM yourtable 

通用代碼:

SELECT dateadd(ms, yourfield/86400000, (yourfield/86400000) + 25567) 
FROM yourtable 

輸出:

August, 30 2010 00:00:14 

SQL小提琴:http://sqlfiddle.com/#!3/c9eb5a/2/0

2
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) 
+0

我還是不明白投票下來。有錯誤嗎?這適用於2008R2。它效率低下嗎?如果我不知道要改進什麼,我該如何改進。 – stinkyjak 2016-08-29 20:36:47

+0

我會想象downvote是提供一個代碼只有答案沒有任何解釋,它在做什麼或爲什麼它的作品。 – iamdave 2017-10-23 07:59:55

0

DATEADD(第二,YourValue,CAST( '1970-01-01 00:00:00' AS DATETIME))

+0

Downvoted。 「將表達式轉換爲數據類型int的算術溢出錯誤」。與問題中提供的數據。 – UnhandledExcepSean 2016-08-12 17:02:31

+0

然而,通過一些調整它可以工作,也許海報可以解決一些問題?(upvoted鼓勵他一下:)) – Gar 2016-08-12 17:08:36

0

下面以新的SQL術語考慮,並會返回毫秒(可以也可修改爲計算字段使用。)的SQL Server 2012或更高版本]

declare @StartDate datetime2(3) = '1970-01-01 00:00:00.000' 
, @milliseconds bigint = 1283174502729 
, @MillisecondsPerDay int = 60 * 60 * 24 * 1000 -- = 86400000 

SELECT DATEADD(MILLISECOND, TRY_CAST(@milliseconds % @millisecondsPerDay AS 
INT), DATEADD(DAY, TRY_CAST(@milliseconds/@millisecondsPerDay AS INT), 
@StartDate));