2016-07-26 82 views
1

我有bigInt:635307578922100000,我需要將其轉換爲DateTime在T-SQL中將特定BigInt轉換爲DateTime

我試過幾個方法可以做到這一點:

SELECT 
    DATEADD(S, CONVERT(bigint,635307578922100000)/1000, CONVERT(DATETIME, '1-1-1970 00:00:00')) 

和:

SELECT 
    DATEADD(ms, 635307578922100000/86400000, (635307578922100000/86400000) +25567) 

雖然我發現上面的工作守則與bigInts,如:1283174502729,我BIGINT我得到以下錯誤:

Msg 8115 ... Arithmetic overflow error converting expression to data type datetime.

有沒有人有任何想法如何解決它?

+1

對於給定的輸入'635307578922100000' – StackUser

+0

您的預期結果是什麼?看起來像這些是蜱蟲。 [將.NET Ticks轉換爲SQL Server DateTime]的可能的重複(http://stackoverflow.com/questions/2313236/convert-net-ticks-to-sql-server-datetime) - 使用這裏的答案給出'2016-07 -26 09:12:00.000' – Bridge

+0

您需要將此值轉換爲01.01.1900 00:00:00以來的小時數,這是適合'int'的最大日期部分精度。然後將ms添加到左側。 – Serg

回答

1

以下是可以計算bigint到datetime的2個計算結果。

select 
tick.value, 

-- 10000000 * 24 * 60 * 60 = 864000000000 
CAST((tick.value - 599266080000000000)/864000000000 AS datetime) as DateTimeCalc1, 

DATEADD(MINUTE, ((tick.value - 599266080000000000)/600000000), '1900-01-01') as DateTimeCalc2, 

from (values 
(convert(bigint,635307578922100000)), 
(convert(bigint,599266080000000000)) 
) tick(value); 

結果:

value    DateTimeCalc1   DateTimeCalc2 
635307578922100000 2014-03-18 16:44:52.210 2014-03-18 16:44:00.000 
599266080000000000 1900-01-01 00:00:00.000 1900-01-01 00:00:00.000 

注意,首先是精確到秒。
毫秒數隨每次運行而變化。

雖然第二隻是精確到分鐘。

有些篡改這些日期時間可以舍入到第二個。

select 
tick.value, 
CAST((tick.value - 599266080000000000)/864000000000 AS datetime) as DateTimeCalc1, 

-- truncated 
CAST(CONVERT(varchar, CAST((tick.value - 599266080000000000)/864000000000 AS datetime),20) AS datetime) as DateTimeCalc1B, 

-- rounded 
CAST(CAST(CAST((tick.value - 599266080000000000)/864000000000 AS datetime) as datetime2(0)) AS datetime) as DateTimeCalc1C, 

-- only for dates between 1981-12-14 and 2118-01-19 
DATEADD(SECOND, ((tick.value - 646602048000000000)/10000000), '2050-01-01') as DateTimeCalc2B 
from (values 
(630823257457000000), 
(635307578922100000), 
(646602048000000000), 
(662380857456770000) 
) tick(value); 
+0

完美的解決方案。謝謝。 –

3

我認爲這是蜱(收益2014-03-18 16:44:52.210)。這裏是溶液:

SELECT DATEADD(
    MILLISECOND, 
    FLOOR(((635307578922100000-599266080000000000)%(10000000*60))/10000), 
    DATEADD(
     MINUTE, 
     FLOOR((635307578922100000-599266080000000000)/(10000000*60)), 
     '01-01-1900')) 

該魔術值599266080000000000是0001-01-01和1900-01-01 PowerShell中計算之間的滴答數如下:

([DateTime]::Parse('1900-01-01')-[DateTime]::MinValue).Ticks 

需要換算,因爲DATEADD將不會與bigint(需要int)一起使用。 SQL Server DateTime也限於1753年1月1日。