web-dev-qa-db-ja.com

データベースにタイムゾーンを保存するためのベストプラクティスは何ですか?

データベース内の各住所のタイムゾーンの収集を開始したいと考えています。タイムゾーンを保存するためのベストプラクティスは何ですか?既存の住所レコードのタイムゾーンを取得するにはどうしますか?

Microsoft SQLサーバー、.net mvc、C#を使用しています。任意の提案をいただければ幸いです。

12
Rodney

常に(または年に2回)変化しないものを保存したい。タイムゾーンデータベース https://en.wikipedia.org/wiki/List_of_tz_database_time_zones はまさに正しいものです。つまり、2つの文字を格納するだけです。

このデータベースから、時間オフセット、および夏時間がアクティブなときを照会できます。これは時間オフセットだけでなく、エリアも提供するため、同じ緯度にある多くの場所は異なるコードを持ち、タイムゾーンルールを個別に変更でき、ソフトウェアでそれを処理できます。

データベースを変更する必要があるのは、場所がどのタイムゾーンに属するかを変更するときだけです。これは非常にまれです。

7
gnasher729

絶対的なベストプラクティスは、SQL99で定義されたTIMESTAMP WITH TIMEZONEデータ型をサポートするデータベースを使用することです。

SQL Serverにはdatetimeoffsetと呼ばれるタイプがあり、実際のタイムゾーンの格納を除いて、TIMESTAMP WITH TIMEZONEが実行できるすべてのことを実行します。できることは、UTCからのオフセット(2013-05-04 12:34:56 -5:00など)を格納することだけです。つまり、タイムゾーンに基づいて格納する前に、それを決定する必要があります。

3
Blrfl

.Net Framework 4.0以上を使用していると仮定すると、必要なのは TimeZoneInfo です。

すべての日付値をUTC形式でデータベースに保存します。各クライアントのID値またはToSerializedString()の結果のいずれかを使用して、TimeZoneInfoオブジェクトを作成し、保存されている日付をローカル形式に変換して表示します。

3
Peregrine

DBに各アドレスのタイムゾーンを保存する必要があるとおっしゃいましたが、それで何をしたいのかお話ししていません。 DBに何かを保存すること自体が目的であることはめったにありません。

いずれにせよ、私は TZデータベース 、別名Olsenデータベースを直接使用するか、TZを統合する市販のソフトウェアを使用することを検討します。タイムゾーンを単に文字列として保存して、 TZ DBエントリ の1つを参照することができます。 「アフリカ/カンパラ」または「ヨーロッパ/パリ」。

2
bdsl