关于 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 服务器无法将字符串转换为有效的日期,因为它正在寻找第 17 个月(如本例)。这让我发疯了!!
有没有人见过这种行为?是否可以告诉 NHibernate 始终使用 yyyy-MM-dd 格式?
谢谢汤姆
ps 使用 FluentNHibernate 进行映射和配置。映射的一个例子是
Map(a => a.DateTimeOffsetField).Not.Nullable();
...即没有什么不寻常的..