2016-05-11 23 views
1

私はbigintにあるいくつかのタイムスタンプを持っています。ここでは1です:MSSQL bigint Unixタイムスタンプ(ミリ秒単位)

これはマイクロ秒の精度にダウンしています。私は現在、これを使用しています

:日時秒まで私を与えている

SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01') 

が、私は、少なくともミリ秒の精度を維持したいと思います。

DATEADDがbigintを処理できないため、bigintを切り捨ててintに変換した理由がわかりました。私は、誰かが私がこれを変換し、少なくともミリ秒の精度を維持するためのより良い方法を見つけ出すことができます願ってい

Arithmetic overflow error converting expression to data type int 

:私は、私はこのエラーを取得することをしないと。

ご協力いただければ幸いです。ありがとう! @akoの助けを借りて

---- UPDATE ------

は、私は一緒にDATETIME2のいずれかミリ秒、マイクロ秒またはナノ秒でBIGINTタイムスタンプを取得し、返す関数を投げた(7)が100 nanosecond precisionです。おそらくもっと効率的かもしれませんが、関数は次のとおりです。

CREATE FUNCTION [dbo].[fn_tsConvert] (@ts bigint) 
RETURNS DATETIME2(7) 
AS BEGIN 
    DECLARE @ts2 DATETIME2(7) 

    -- MILLISECOND 
    IF(LEN(@ts) = 13) 
     SET @ts2 = DATEADD(HH,-4,DATEADD(MILLISECOND, @ts % 1000, DATEADD(SECOND, @ts/1000, CAST('1970-01-01' as datetime2(7))))) 

    -- MICROSECOND 
    IF(LEN(@ts) = 16) 
     SET @ts2 = DATEADD(HH,-4,DATEADD(MICROSECOND, @ts % 1000000, DATEADD(SECOND, @ts/1000000, CAST('1970-01-01' as datetime2(7))))) 

    -- NANOSECOND 
    IF(LEN(@ts) = 19) 
     SET @ts2 = DATEADD(HH,-4,DATEADD(NANOSECOND, @ts % 1000000000, DATEADD(SECOND, @ts/1000000000, CAST('1970-01-01' as datetime2(7))))) 

    RETURN @ts2 

END 
+0

'次いで、(24×60×1000×60)' 2.'で割って一日にタイムスタンプを変換1.'時間のバランスを取って、変換された日付に追加する – Squirrel

答えて

4

あなたはナノ秒の精度を扱っていると思います。ネイティブSQLで取得できるものは100nsの精度です。

declare @ts as bigint = 1462924862735870900 

select dateadd(NANOSECOND, @ts % 1000000000, dateadd(SECOND, @ts/1000000000, cast('1970-01-01' as datetime2(7)))) 

結果は、2016年5月11日00:01:02.7358709

+0

私はあなたが正しいと思います。私はそれがナノ秒であることを知らなかった。私がオンラインで通した変換器はすべて、マイクロ秒までしか使用できませんでした。それを指摘していただきありがとうございます、あなたのソリューションに感謝します。完璧に働いているようだ。再度、感謝します! – Sequenzia

関連する問題