我们使用以下代码生成SQL代码以针对firebird数据库进行查询;
DSRCash.GetAll(x => x.Account.ID == Account.ID
&& x.Date_Record <= dateTO
&& x.Date_Record >= dateFROM).ToList();
dateTO和dateFROM参数都是不可为空的DateTime,它们各自的数据库列也是如此。
生成的SQL where子句如下;
where (struct_cas0_.DELETED IS NULL)
and struct_cas0_.ACCOUNT_ID = 372 /* @p0 */
and struct_cas0_.DATE_RECORD <= '2011-02-18T13:00:00.00' /* @p1 */
and struct_cas0_.DATE_RECORD >= '2010-02-17T13:00:00.00' /* @p2 */
您可以看到DateTime文字已使用“s”或标准可排序格式进行格式化。 Firebird似乎不支持这种日期格式,如果我们从datetime文字中删除“T”,查询将成功执行。
是否可以将DateTime转换更改为正在执行的字符串?
我还应该提到我们正在使用NHibernate作为这个项目的ORM。
答案 0 :(得分:1)
我想你可以使用一个表达式访问者,当遇到一个日期需要两条路径时。 1.如果它是一个常量 - 用一个正确格式化的字符串替换它,转换为datetime 2.如果是MemberExpression则什么都不做。
这会将你的sql改为
其中(struct_cas0_.DELETED为空) 和struct_cas0_.ACCOUNT_ID = 372 / * @ p0 * / 和struct_cas0_.DATE_RECORD&lt; = CAST('2011-02-18'AS DATETIME)/ * @ p1 * / 和struct_cas0_.DATE_RECORD&gt; = CAST('2010-02-18'AS DATETIME)/ * @ p2 * /