当前位置: 首页 > 知识库问答 >
问题:

JDBI/Postgress Select查询失败,日期时间比较

侯兴为
2023-03-14

后继版本:10.4

表列名/类型:带时区的updated_at timestamp(6)

final String SELECT_PAYMENT_INFO_QUERY =
    "SELECT i.code, p.* 
    FROM information i 
    INNER JOIN product p ON i.ref = p.information_ref 
    WHERE p.reference = :reference AND p.type = :paymentMethodType AND p.error_state = :errorState 
    AND p.updated_at IS NOT NULL AND p.updated_at >= :queryFromTime 
    ORDER BY p.updated_at ASC 
    FETCH FIRST :numberOfRows ROWS ONLY"

Java方法:

    public List<ProductInformationDTO> retrieveProductInformations(
      ZonedDateTime fetchFromTime, int noOfRecords)
  {
    try
    {
      return dbi.inTransaction((HandleCallback<List<ProductInformationDTO>, Exception>) handle ->
      {
        final List<ProductInformationDTO> productInfos = handle.createQuery(SELECT_PAYMENT_INFO_QUERY)
            .bind("reference", "ABCD")
            .bind("paymentMethodType", "CREDIT_CARD")
            .bind("errorState", "COMPLETED_WITH_ERRORS")
            .bind("queryFromTime", fetchFromTime.toOffsetDateTime())
            .bind("numberOfRows", noOfRecords)
            .map(productInfoMapper)
            .list();

        return productInfos;
      });
    }
    catch (Exception e)
    {
      LOG.error("Failed to complete the retrieve operation.", e);
      throw new TransactionException(e);
    }
  }

这个查询和方法在H2数据库中很好地工作。然而,当使用Postgress数据库对其进行测试时,我得到以下异常

我也尝试了FetchFromTime.ToLocalDateTime(),但得到了相同的异常。

共有1个答案

颜高朗
2023-03-14

不能在fetch first(或limit)子句中使用位置参数。假设您能够容忍运行本机查询,一种解决方法是使用row_number:

SELECT *
FROM
(
    SELECT i.code, p.*, ROW_NUMBER() OVER (ORDER BY p.updated_at) rn
    FROM information i 
    INNER JOIN product p ON i.ref = p.information_ref 
    WHERE p.reference = :reference AND p.type = :paymentMethodType AND
          p.error_state = :errorState AND p.updated_at IS NOT NULL AND
          p.updated_at >= :queryFromTime 
) t
WHERE rn <= :numberOfRows
 类似资料:
  • 用于排序的日期比较不起作用。请指教。 我的代码: 错误: 错误:找不到返回d1的符号。与(d2)比较 符号:方法比较到(日期) 位置:日期类型的变量d1 注意:某些输入文件使用或重写了不推荐的API 注意:使用-Xlint:deprecation重新编译以获取详细信息 注意:某些输入文件使用未检查或不安全的操作 注意:使用-Xlint重新编译:未选中以获取详细信息。

  • 我的数据库有一列是 当生成实体时,它在实体类中创建了一个< code>Timestamp字段。 我的传入对象是一个< code>java.util.Date对象。< code >开始日期和< code >结束日期。 我需要编写一个 JPA 查询,该查询将获取在日期和之间的记录。它正在考虑时间。 查询条件

  • 我有这样的疑问: 请注意,但不知为什么结果是... 我错过了什么?

  • Created_date类型为date 日期格式默认为yyyy-dd-MM

  • 我有一个类似于。 我有一个数字,12作为参数值。我想做的是,我想将数字12与上述创建的时间和目标进行比较。我该怎么做呢。 我发现,在检索数据的过程中,Laravel会自动将这些创建的对象转换为碳对象。是否有一种方法可以在检索期间提取创建的_的月份部分? 显然,上面的代码不起作用。我发现正在做

  • 问题内容: 我正在管理事件数据库。每个事件都有开始和结束时间戳记()。 目前,我可以通过一个SQL查询执行以下操作: 建立日历,并记下发生事件的日期 列出给定日期(YYYY / MM / DD,YYYY / MM)中发生的事件 问题是当一个事件跨越几天时,我无法在它的开始和结束时间戳之间的日期列出它。 例如: 活动开始于2011/05/25和结束于2011/05/27,但我无法在页面2011/05