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

根据JPA中的datetime2(7)列查询表

利海阳
2023-03-14

我需要根据MS SQL Server中定义为datetime2(7)的列,查询给定日期范围内的记录列表。

从HTTP请求中,我将收到如下startDate和endDate。

http://{host:port}/api/records/date?startDate=**2021-05-31T14:12:44.8020000**&endDate=**2021-05-31T14:12:44.8020000**

在数据库中,lastUpdate列中的值存储为2021-05-31 14:12:44.8020000

我正在尝试将传入的查询参数(字符串)转换为java。sql。代码中的日期如下所示

@Override
public Page<Entity> getAllRecordsWithDateRange(String startDate, String endDate) {
   
    Page<Entity> recordsWithinDateRange = null;
    String time = startDate;
    String formatIn = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS";
    String formatOut = "yyyy-MM-dd HH:mm:ss.SSSSSS";
    SimpleDateFormat in = new SimpleDateFormat(formatIn);
    SimpleDateFormat out = new SimpleDateFormat(formatOut);

    Date dateIn = null;
    try {
        dateIn = in.parse(time);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    String valueOut = out.format(dateIn);

    System.out.println(">>> " + valueOut);
    Pageable page = PageRequest.of(0,5000);
    Date date1= null;
    try {
        date1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").parse(valueOut);
        java.util.Date utilDate = date1;
        recordsWithinDateRange =  repo.getAllRecordsBetweenDates(utilDate,utilDate,page);

    } catch (ParseException e) {
        e.printStackTrace();
    }

    
    return recordsWithinDateRange;
}

我在这里看到的问题是,我的实际输入日期是2021-05-31T14:12:44.8020000,但在转换后,它会增加到另一个时间2021-05-31 16:26:24.000000。因此,查询没有从数据库返回任何记录。

有人能帮我解决这个问题吗?蒂娅!

共有1个答案

游炳
2023-03-14

java。utilDate-Time API及其格式化API,SimpleDateFormat已经过时且容易出错。建议完全停止使用它们,并切换到现代日期时间API*

使用java解决方案。时间,现代日期时间API*

datetime2映射到JDBC中的TIMESTAMPANSI SQL类型或LocalDateTime

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("u-M-d'T'H:m:s.SSSSSSS", Locale.ENGLISH);
        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSSS", Locale.ENGLISH);
        String strDateTime = "2021-05-31T14:12:44.8020000";
        LocalDateTime ldt = LocalDateTime.parse(strDateTime, dtfInput);
        System.out.println(ldt.format(dtfOutput));
    }
}

输出:

2021-05-31 14:12:44.8020000

在线演示

查看此答案,了解如何使用LocalDateTime执行JDBC操作。

使用传统API的解决方案:

简单数据格式不能正确处理超过毫秒精度的秒级分数。请检查此答案以了解更多信息。

您需要将日期时间字符串截断为毫秒精度。

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class Main {
    public static void main(String[] args) throws ParseException {
        String strDateTime = "2021-05-31T14:12:44.8020000";
        strDateTime = strDateTime.substring(0, strDateTime.indexOf('.') + 4);

        String formatIn = "yyyy-MM-dd'T'HH:mm:ss.SSS";
        String formatOut = "yyyy-MM-dd HH:mm:ss.SSS";

        SimpleDateFormat in = new SimpleDateFormat(formatIn);
        SimpleDateFormat out = new SimpleDateFormat(formatOut);

        System.out.println(out.format(in.parse(strDateTime)));
    }
}

输出:

2021-05-31 14:12:44.802

在线演示

*由于任何原因,如果您必须坚持Java6或Java7,您可以使用ThreeTen-Backport将大部分java.time功能备份到Java6

 类似资料:
  • 如何实现以下作为JPA条件查询的查询:sql JPA标准查询基于id从3个表中选择Table 2 long id; long bpId; String project Name; JPA条件查询根据id从3个表中选择表3长id;字符串empName;字符串contactNum;

  • 描述: 我有两张桌子,和。我想在显示员工详细信息时直接显示,但我不想配置这两个实体之间的关系(或)。 因为这将加载列的所有值,但这些值对我来说毫无用处,所以我只需要 。下面是我的代码,但它不起作用。 商店员工类型: 商店_员工: 存储库: 这可以显示<code>类型名称@Transient,它可以成功保存,但当我查询实体时,“typeName”的值为空。

  • 我有一个Spring Boot应用程序,使用Spring Data JPA查询MySQL数据库。 我需要得到一份经过一些参数筛选的课程列表。 我通常使用语法

  • 我有3个实体在我的数据库。实体A具有主密钥PK-A,实体B具有主密钥PK-B,实体C具有主密钥PK-C。 实体A与实体B具有1对多关系,实体B与实体C具有1对多关系 我想在Spring Data JPA中基于PK-A(实际上是实体B中的外键)查询实体C。有可能吗? 但这行不通。还有什么建议我可以试试吗?

  • 最近,我从firebase实时数据库迁移到firebase firestore,因为它说查询的速度取决于从集合中检索的数据集的大小(文档数),而不是集合中的文档数。我检查了100、5000和10000个集合中不同数量的文档,在一次查询中检索了20个文档。我看到的是,当我从一个集合中的100个、5000个和10000个文档移动时,查询的结果时间增加了。为什么会这样?是因为firestore处于测试阶

  • 我们希望将字符串列表传递到名为JPA的本机查询中。我们如何才能做到这一点。它正在引发无效的查询参数异常。