0

現在、複数の国とタイム ゾーンで使用される .net アプリケーションを開発しています。バックエンド データベースは sql サーバーです。

私はdatetime、datetime2、およびdatetimeoffsetのデータ型を調べてきましたが、少し混乱しています。

いくつかの例は、私の混乱を助けるかもしれません。在庫状況の開始日と終了日を含む製品データを含むテーブルがあるとします。そのため、開始日と終了日については、データは utc 日付として保存され、タイム ゾーンが含まれます。

データベースにクエリを実行し、開始日と終了日の間にないレコードを省略したい場合は、次のようにします。

select * from products where stardate <= getutcdate() and enddate >= getutcdate;

ただし、utc の日付はデータが必要な国の時間を反映していない可能性があるため、これは有効ではありません。タイム オフセットは適用されません。それで、これを回避する方法はありますか?

これに関する次の質問は、その国の夏時間がいつ変わるかということです。オフセットは変わらないのでしょうか? すなわち。オフセット値が正しくないため、データが古くなります。

アプリケーションのレイヤーを上に移動し、.net コードに移動します。データベースからデータを取得するときに、終了日/開始日を含む DateTimeOffset 変数を作成します。開始日と終了日を確認するために SQL に似たコードを書きたい場合、DateTime.UtcNow を使用すると同じ問題が発生しませんか?

私の混乱を助けるための助けは素晴らしいでしょう。

4

1 に答える 1

1

Utc の日付はタイム ゾーンと夏時間に依存しないため、SQL サーバーでのすべての計算は utc 時間のみで実行する必要があります。タイム ゾーン情報 (ロケール) はローカル pc に保存され、日時クラスを使用して utc からローカル テーマに変換するときに適用されます。Web ページの場合、日付は utc 文字列として渡され、現地時間に変換されます。日付オブジェクト (tolocaltime) を介して、時間は、SQL サーバーに送信される前に、Web ページまたはアプリケーションによって変換される必要があります。

于 2012-11-09T02:07:35.587 に答える