15

データベース テーブルに UNIX タイム スタンプの列があります。これは、クウェートのタイム ゾーンにあるシステムからのものです。

データベース サーバーのタイム ゾーンはEastern Time US & Canadaです。次に、SQL クエリを使用して UNIX タイム スタンプをクウェート タイム ゾーンの日付値に変換する必要があります。

この UNIX タイム スタンプをクウェート タイム ゾーンの日付値に変換する方法を誰か教えてもらえますか?

4

1 に答える 1

27

Unix タイムスタンプは、1970 年 1 月 1 日 UTC からの整数秒数です。

データベースにこの数値の整数列があると仮定すると、データベースサーバーのタイムゾーンは関係ありません。

datetime最初にタイムスタンプを型に変換します。

SELECT DATEADD(second, yourTimeStamp, '1970-01-01')

datetimeこれは、タイムスタンプに対応するUTCになります。

次に、この値をターゲット タイム ゾーンに調整する方法を知る必要があります。世界のほとんどの地域では、夏時間のため、1 つのゾーンに複数のオフセットが設定される場合があります。

残念ながら、SQL Server にはタイム ゾーンを直接操作する機能がありません。たとえば、米国太平洋時間を使用している場合、7 時間または 8 時間を差し引く必要があるかどうかを知る方法はありません。他のデータベース (Oracle、Postgres、MySql など) にはこれを処理する方法が組み込まれていますが、残念ながら SQL Server にはありません。したがって、汎用ソリューションを探している場合は、次のいずれかを実行する必要があります。

  • タイム ゾーン データをテーブルにインポートし、タイム ゾーン ルールの変更に合わせてそのテーブルを維持します。そのテーブルを一連のカスタム ロジックと共に使用して、特定の日付のオフセットを解決します。

  • タイム ゾーン データを含む Windows レジストリ キーを取得するために使用xp_regreadし、再び多数のカスタム ロジックを使用して特定の日付のオフセットを解決します。もちろん、xp_regreadこれは悪いことであり、付与された特定の権限が必要であり、サポートも文書化もされていません。

  • TimeZoneInfo.Net でクラスを使用する SQLCLR 関数を記述します。残念ながら、これには「安全でない」 SQLCLR アセンブリが必要であり、悪いことが起こる可能性があります。

IMHO、これらのアプローチはどれも非常に優れたものではなく、これを SQL で直接行うための適切な解決策はありません。最善の解決策は、UTC 値 (元の整数またはdatetimeUTC のいずれか) を呼び出し元のアプリケーション コードに返し、代わりにそこでタイムゾーン変換を行うことです (たとえば、TimeZoneInfo.Net または他のプラットフォームの同様のメカニズムで)。 .

ただし、クウェートは夏時間に変更されないゾーンにあるという点で幸運です (そして常にそうでした)。常に UTC+03:00 です。したがって、単純に 3 時間を加算して結果を返すことができます。

SELECT DATEADD(hour, 3, DATEADD(second, yourTimeStamp, '1970-01-01'))

ただし、これはどのタイム ゾーンでも機能する汎用ソリューションではないことを認識してください。

必要に応じて、 などの他の SQL データ型の 1 つを返すこともできますがdatetimeoffset、これは、値が 3 時間のオフセットであることを誰が見ても反映するのに役立ちます。変換プロセスが変わったり、良くなったりすることはありません。


更新された回答

SQL Server でタイム ゾーンをサポートするためのプロジェクトを作成しました。ここからインストールできます。次に、次のように簡単に変換できます。

SELECT Tzdb.UtcToLocal('2015-07-01 00:00:00', 'Asia/Kuwait')

夏時間を使用するものを含め、IANA tz データベースの任意のタイム ゾーンを使用できます。

上記の方法を使用して、UNIX タイムスタンプから変換することもできます。両方をまとめると:

SELECT Tzdb.UtcToLocal(DATEADD(second, yourTimeStamp, '1970-01-01'), 'Asia/Kuwait')

再更新

AT TIME ZONESQL Server 2016 では、ステートメントでタイム ゾーンのサポートが組み込まれています。これは、Azure SQL データベース (v12) でも利用できます。

SELECT DATEADD(second, yourTimeStamp, '1970-01-01') AT TIME ZONE 'Arab Standard Time'

この発表のその他の例。

于 2013-06-01T15:07:02.760 に答える