1

2 つの Date プロパティを持つクラスを含む LINQ to SQL データ コンテキストがあります。

DateActive DateTime NOT NULL
DateInactive DateTime NULL

MSDN には次のように明確に記載されています。

LessThanOrEqual 演算子は、ティック数を比較することで、2 つの DateTime 値の関係を判断します。DateTime オブジェクトを比較する前に、オブジェクトが同じタイム ゾーンの時間を表していることを確認してください。これを行うには、Kind プロパティの値を比較します。

http://msdn.microsoft.com/en-us/library/system.datetime.op_lessthanorequal.aspx

しかし、私の LINQ クエリでは、上記の 2 つのフィールドが、 which isDateTimeKind.Unspecifiedと比較している場所として表示されています。Date.TodayDateTimeKind.Local

DateTimeKind.Localアプリケーション全体で上記のプロパティを指定する良い方法はありi.DateActive.ToLocalTime.Dateますi.DateInactive.Value.ToLocalTime.Dateか?

私は.NET 4.5ではなく.NET 4を使用しているので、同じことが当てはまると思います。

4

1 に答える 1

2

MSDN の記事では、クライアント側の日付の比較について説明しています。Linq To SQL は、DateTimeKind プロパティが使用されていない SQL にステートメントを変換します。

DateTime の代わりに DateTimeOffset を使用する必要があります。これにより、SQL でDateTimeOffset メソッドを使用し、SQL Server で DATETIMEOFFSET 型を利用できるようになります。

LINQ to SQL は SQL ステートメントを生成します。System.DateTime および SQL Server の DATETIME 型にはタイムゾーン情報がないため、タイムゾーンを考慮しようとしても意味がありません。2 つの値のいずれにもタイムゾーンが含まれていないため、自動変換を行うにはどうすればよいでしょうか?

質問の 2 つの DateTime 値は、2 つの異なるソースからのものです。DateTime.Todayタイムゾーンがわかっているローカルマシンからのものなので、DateTimeKind.Local.

ただし、データベースの列はデータベースから取得され、タイムゾーン情報を含まないデータ型から取得されます。DateTimeKind.Unspecifiedここでは正しい値です。ところで、データベースに保存するときは、どのタイムゾーンを想定していますか? UTC?あなたのローカルタイムゾーン?夏時間か冬時間か?

DateTime 型を引き続き使用する場合は、datetime パラメータをクライアントの適切なタイムゾーンに変換する必要があります。変換先の SQL はタイムゾーンに依存しないため、データベース フィールド間の比較では変換は必要ありません。

異なるタイムゾーンをサポートしたい場合は、DateTimeOffset タイプに切り替える必要があります。

もちろん、すべてのデータが同じタイムゾーンを共有していると仮定して、違いを無視することもできます。その場合、DateTime で十分です。

于 2013-07-04T10:18:00.383 に答える