web-dev-qa-db-ja.com

SQL Server監査ファイル名から日付を取得する

SQL Server監査ファイル名は、次のパターンを使用します。

Name_GUID_PartitionNumber_Timestamp.sqlaudit

以下のファイル名の例:

Audit-ObjectChanges_2D94C1E8-CCAD-405F-A9F2-A45FA5EDAD8F_0_132327053636850000.sqlaudit

クエリを実行するとsys.dm_server_audit_statusわかりましたstatus_time列には、4つの監査で2020-04-30 08:29:22.6070000の値があります。すべてのファイル名のファイル名のタイムスタンプ部分に132327053636850000があります。

132327053636850000 = 2020-04-30 08:29:22.6070000と想定していますが、ファイル名のタイムスタンプを以前の監査ファイルの日時形式に変換するにはどうすればよいですか?

ありがとう

2
boomcubist

これは、1601-01-01FILETIME )以降の100ナノ秒のティック数のように見えます

したがって、それに基づいて次の作品(125911584000000000は1601から2000の間のこれらのティックの数です。これは、intのオーバーフローを避けるために最初に減算されます)

また、返された時刻はUTCであるように見えるため、ローカルタイムゾーンに変換する必要があります(これについては、私が想定しています)。

DECLARE @value    BIGINT = 132327053636850000,
        @datetime DATETIME2

SELECT @datetime = DATEADD(MILLISECOND, 
                           @value%10000000 / 10000, 
                             DATEADD(SECOND, 
                             ( @value - 125911584000000000 ) / 10000000, 
                             CAST('2000-01-01' AS DATETIME2)))

SELECT CONVERT(DATETIME2(3), 
                 SWITCHOFFSET(@datetime,
                 DATEPART(TZOFFSET, @datetime AT TIME ZONE 'GMT Standard Time'))) 

戻り値

2020-04-30 08:29:23.685
4
Martin Smith