0

关于 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();

...即没有什么不寻常的..

4

1 回答 1

0

我已经通过更改 sql server 实例以使用英国时间文化“修复”了这个问题,这样它就接受了 NHibernate 创建的两个值......仍然有兴趣知道为什么会出现这些差异。

于 2012-07-17T21:22:00.467 回答