NHibernate が DateTimeOffset フィールドでデータベースにクエリを送信する方法について、奇妙な動作が発生しています。次の例を考えます。
DateTimeOffset? myDate = new DateTimeOffset(2012, 3, 17, 0, 0, 0, new TimeSpan(1, 0, 0));
var test = HibernateSession.Query<ExampleEntity>().Where(c => c.DateTimeOffsetField > myDate).ToList();
DateTimeOffset? myDate2 = new DateTimeOffset(2012, 3, 1, 0, 0, 0, new TimeSpan(1, 0, 0));
var test2 = HibernateSession.Query<ExampleEntity>().Where(c => c.DateTimeOffsetField > myDate2).ToList();
NHibernate Profiler を使用して生成された SQL を確認すると、最初のクエリは次のように表示されます。
exampleentity0_.[DateTimeOffsetField] > '17/03/2012 00:00:00 +01:00' /* @p0 */
2番目の
exampleentity0_.[DateTimeOffsetField] > '2012-01-02T23:00:00.00' /* @p0 */
日付の書式が異なることに気付きましたか? 日が 12 より大きい場合は最初の形式が使用され、12 未満の場合は 2 番目の形式が使用されます。これにより、最初の形式の日付がある場合にエラーが発生します。これは、SQL サーバーが文字列を有効な日付に変換できないためです (この例のように) 17 月を探しているためです。これは私を夢中にさせています!!
誰もこの動作を見たことがありますか? NHibernate に常に yyyy-MM-dd 形式を使用するように指示することは可能ですか?
ありがとうトム
ps マッピングと構成に FluentNHibernate を使用します。マッピングの例は次のとおりです。
Map(a => a.DateTimeOffsetField).Not.Nullable();
...つまり、異常なことは何もありません..