c# - NHibernate Criteria 查询与 Postgresql 时间戳列,.NET DateTime 在查询参数中截断毫秒

标签 c# postgresql nhibernate

我有一个 NHibernate 标准查询如下:

using (var unitOfWork = this.UnitOfWorkFactory.CreateUnitOfWork())
{
    const string fromstring = "2013-01-29 23:30:33.5993";
    var from = DateTime.Parse(fromstring);

    const string tostring = "2013-01-29 23:30:33.63434";
    var to = DateTime.Parse(tostring);

    var criteria = unitOfWork.Session.CreateCriteria<DataModel>();

    criteria.Add(Restrictions.Ge("Created", from));
    criteria.Add(Restrictions.Le("Created", to));

    items = criteria.List<DataModel>();
}

我正在使用 Postgresql,这是表映射:

-- Table: data

-- DROP TABLE data;

CREATE TABLE data
(
  id integer NOT NULL DEFAULT nextval('data__sequence'::regclass),
  created timestamp without time zone NOT NULL,
  CONSTRAINT itemsupdatelog_pkey PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE data
  OWNER TO ubuntu;

和 NHibernate 映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Data" namespace="Data.Models">
  <class name="DataModel" table="Data" mutable="false">
    <id name="Id">
      <generator class="sequence">
        <param name="sequence">Data__Sequence</param>
      </generator>
    </id>

    <property name="Created" not-null="true" type="Timestamp" />

  </class>
</hibernate-mapping>

我可以确认表中的数据看起来不错(即所有创建的值肯定有毫秒数,并且当我使用 NHibernate 查询数据库的 OUT 值时,DateTime 对象具有正确的毫秒数)。

但是,当我使用 NHProf 检查查询时,NHibernate 没有在查询中发送正确的毫秒数:

    SELECT this_.Id            as Id1_0_,
       this_.Created       as Created1_0_,
FROM   Data this_
WHERE  this_.Created >= '2013-01-29T23:30:33.00' /* :p1 */
       and this_.Created <= '2013-01-29T23:30:33.00' /* :p2 */
ORDER  BY this_.Created desc

有什么想法吗?

最佳答案

更新: 问题似乎出在 NHProf 中。 NHProf 报告的 SQL:

SELECT this_.Id      as Id0_0_,
   this_.Created as Created0_0_
FROM   data this_
WHERE  this_.Created >= '2013-01-29T23:30:33.00' /* :p0 */
       and this_.Created <= '2013-01-29T23:30:33.00' /* :p1 */

在 postgres 日志中报告的 SQL:

SELECT this_.Id as Id0_0_, this_.Created as Created0_0_ 
FROM data this_ 
WHERE this_.Created >= ((E'2013-01-29 23:30:33.599300')::timestamp) 
and this_.Created <= ((E'2013-01-29 23:30:33.634340')::timestamp)

为了仔细检查,我在查询中插入了一个介于毫秒之间的行:

insert into data (created) values ('2013-01-29 23:30:33.600')

并返回这一行。

关于c# - NHibernate Criteria 查询与 Postgresql 时间戳列,.NET DateTime 在查询参数中截断毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14594573/

相关文章:

c# - 保存添加额外小数位

c# - 将数据从数组插入数据表

sql - 可序列化事务中的40类错误都是正常的吗?

循环中的 PostgreSQL DROP TABLE 失败,错误为 : out of shared memory

database - 从文本文件复制时,PostgreSQL 可以将超出范围的值设置为 null 吗?

SQL 联合到 NHibernate 标准

c# - 小于字节存储的选项?

c# - MVC2 中的可选和命名参数、语言规范

sql-server - 时间戳精度 - 获得毫秒数

"in subselect"的 hibernate 标准