NHibernate根据一个月的哪一天来改变创建基于DateTime的查询的方式



关于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 */

第二个作为

exampleentity0_.[DateTimeOffsetField] > '2012-01-02T23:00:00.00' /* @p0 */

注意到日期的不同格式了吗?如果一个月中的日期大于12,则使用第一种格式;如果小于12,则采用第二种格式。当我们使用第一种格式的日期时,这会导致错误,因为SQL server无法将字符串转换为有效的日期,因为它正在查找第17个月(如本例所示)。这把我逼疯了!!

以前有人见过这种行为吗?是否可以告诉NHibernate始终使用yyyy-MM-dd格式?

谢谢Tom

p.s.使用FluentHibernate进行映射和配置。映射的一个例子是

Map(a => a.DateTimeOffsetField).Not.Nullable();

即没有什么异常。。

我已经"修复"了这个问题,将sql server实例更改为使用英国时间区域性,以便它接受NHibernate创建的两个值。。。仍然有兴趣知道为什么会出现这些差异。

最新更新