9

値が2013-03-2215:19:02.000の「datetime」列があります

この値をエポックタイムに変換し、「bigint」フィールドに保存する必要があります

上記の時間の実際のエポック値は、、1363945741898を使用した場合です。

  select DATEDIFF(s, '1970-01-01 00:00:00', '2013-03-22 15:19:02.000')

1363965542使用すると、、

select DATEDIFF(ms, '1970-01-01 00:00:00', '2013-03-22 15:19:02.000')

わかった、

メッセージ535、レベル16、状態0、行1datediff関数がオーバーフローを引き起こしました。2つの日付/時刻インスタンスを区切る日付部分の数が多すぎます。精度の低いdatepartでdatediffを使用してみてください。

'datetime'フィールドから正確なエポック値を取得する方法

SQL Server 2008を使用しています。また、これは2005でも機能するはずです。

4

4 に答える 4

12

これは、テストされていない、フリーハンドから書かれた例です:)

declare @v_Date datetime
set @v_Date = '2013-03-22 15:19:02.000'

declare @v_DiffInSeconds integer
declare @v_DiffInMSeconds bigint

select @v_DiffInSeconds = DATEDIFF(s, '1970-01-01 00:00:00', @v_Date)
select @v_DiffInMSeconds = cast(@v_DiffInSeconds as bigint) * 1000 + cast(DATEPART(ms, @v_Date) as bigint)

編集 タイムゾーンの変換を説明するために、以下の例を作成しました。指定されたタイムスタンプ(最後の3桁の「898」を削除した秒単位)は、ここで5.5時間(19800秒)を追加することによってローカルISTタイムゾーンに変換され、現地時間からのタイムスタンプに変換されます。再びGMT。以下の計算は、質問の値と一致します(秒単位)。

declare @v_time datetime
set @v_time = '1970-01-01 00:00:00'

declare @v_date datetime
set @v_date = '2013-03-22 15:19:01'

-- This returns "March, 22 2013 15:19:01"
select dateadd(s, (1363945741 + 19800), @v_time)

-- This returns "1363945741"
select datediff(s, @v_time, @v_date) - 19800
于 2013-03-26T11:13:03.517 に答える
3

正確なミリ秒を取得しようとすると、オーバーフロー例外が発生します。秒までの値を取得し、1000を掛けることができます。

new Date().getTime()これは、javascriptの場合と同等です。

以下のステートメントを使用して、時間を秒単位で取得します。

SELECT cast(DATEDIFF(s, '1970-01-01 00:00:00.000', '2016-12-09 16:22:17.897' ) as bigint)

以下のステートメントを使用して、時間をミリ秒単位で取得します。

SELECT cast(DATEDIFF(s, '1970-01-01 00:00:00.000', '2016-12-09 16:22:17.897' ) as bigint) * 1000

以下のステートメントを使用して、エポックを人間が読める日時に変換します。

select DATEADD(s, 1481300537, '1970-01-01 00:00:00')
于 2016-12-12T19:56:34.180 に答える
1

日時へのエポック

create function [dbo].[EpochToDate](@Date bigint)
returns datetime
begin
    return (select dateadd(s, @Date, '19700101'))
end 
于 2019-08-05T10:59:21.680 に答える
0

以下のコードを使用して、エポックタイムから人間が読める日付を取得します

select DATEADD(s,convert(bigint,@date)/2, DATEADD(s, convert(bigint,@date)/2, '1970-01-01 00:00:00'))
于 2020-11-13T10:52:10.647 に答える