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

无法比较java。util。带有MySQL datetime列值的日期值

明宜年
2023-03-14

我试图从表中获取特定日期的结果。我使用URL以字符串格式传递日期,然后将字符串日期解析为java.util.日期,然后使用它从表中获取值。在表中,值存储在数据类型为Datetime的列中。

@Query(value = "" +
        "FROM " +
        "   MarketingForm mf " +
        "WHERE " +
        "   (:createdAt is null OR mf.createdAt = :createdAt)" +
        "   AND (:verticalId is null OR mf.verticalId = :verticalId)" +
        "   AND (:tag is null OR mf.tag = :tag)"
)
List<MarketingForm> findAllByCreatedAtAndVerticalIdAndTag(@Param("createdAt") Date createdAt, @Param("verticalId") Long verticalId, @Param("tag") String tag);

下面是字符串日期和相应的java.util.日期

  • 字符串日期='2021-03-03'
  • 爪哇。util。日期转换日期='Wed Mar 03 00:00:00 IST 2021'

我用来解析字符串日期java.util.日期的方法-

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
return formatter.parse(formCreatedDate);

现在我不确定这里发生了什么。爪哇。util。Date没有得到正确的解析,或者我是否做了错误的比较,但是即使记录在表中,查询也无法获取结果。

为什么上述SQL无法获取指定日期的记录,即使表中存在记录?

注意:表中的数据是timeformat,我只需要比较日期的日期组件

共有1个答案

苍意智
2023-03-14

我不确定你的期望是什么,因为你的问题不清楚,所以我不能给出准确的答案。但是我可以讨论你的方法和代码中的一些问题。

首先,永远不要使用java.util.Date。这个可怕的类是多年前被JSR310中定义的现代java.time类所取代的遗留日期-时间类的一部分。同样,永远不要使用日历,也永远不要使用SimpleDateFormat。Sun、Oracle和JCP社区在采用JSR310后放弃了这些遗留类,您也应该这样做。JPA和HiberNate都已经更新以支持java.time类,JDBC 4.2规范也是如此。

另一个可能的问题是,您可能混淆了java。sql。日期java。util。日期。注意你的import语句。同样,不要使用任何一个Date类。

你提到了一个字符串2021-03-03,但没有真正解释它在哪里。无论如何,这表示一个仅限日期的值。但是你说你正在访问MySQL中的DATETIME列。根据MySQL 8文档,该类型表示带有时间的日期。

DATETIME类型用于同时包含日期和时间部分的值。MySQL以“YYYY-MM-DD hh:MM:ss”格式检索并显示日期时间值。支持的范围为“1000-01-01 00:00:00”到“9999-12-31 23:59:59”。

因此,通过仅有日期的值查询日期与时间列是没有意义的。数据库无法将仅有日期的值与日期与时间进行比较。您需要指定一个时间跨度,为您的开始和结束指定一对日期与时间值。

另一个问题:您正在尝试使用java。util。日期代表一个时刻,一个特定的日期和UTC上下文中的时间-

注意:如果您试图表示数据库中的时刻、时间轴上的特定点,那么您的列使用了错误的数据类型。在某些情况下,必须使用类似于SQL标准的带有时区的时间戳的数据类型。在MySQL 8中,这将是时间戳类型。MySQL中的时间戳类型跟踪UTC中的时刻,总是UTC。如果您讨论的列名为createdAt,那么您几乎肯定使用了错误的数据类型,因为必须使用SQL标准时区时间戳来跟踪作为历史记录传递的时刻。但我将忽略这个关键问题,继续讨论你在书面问题中指定的类型。

如果您没有跟踪时刻,例如跟踪保存在附加列中的时区旁边的未来约会,那么您对DATETIME的使用是正确的。如果您确信此数据类型符合您的目的,那么在Java适当的匹配将是LocalDateTime类。

通过使用半开放方法定义时间跨度,在DATETIME列上查询一天的数据。开始是包容性的,而结束是排他性的。因此,一天从一天的第一刻开始,一直持续到第二天的开始,但不包括第二天的开始。在半开放的情况下,我们不在之间使用SQL关键字

这里有一个简单的代码示例来适应你的情况。我既不使用Spring也不使用HiberNate,所以你必须相应地翻译。

对于只有日期的输入字符串,解析LocalDate

提示:询问“大于或等于”的一个简短方法是“不小于”。我们在下面SELECT语句中谓词的第一个案例中看到了这一点。

LocalDate ld = LocalDate.parse( "2021-03-03" ) ;
LocalDateTime startOfDay = ld.atStartOfDay() ;
LocalDateTime startOfNextDay = ld.plusDays( 1 ).atStartOfDay() ;
String sql = "SELECT * FROM my_table WHERE when !< ? AND when < ? ;" ;  // Performing query over a span-of-time defined as Half-Open. 
…
myPreparedStatement.setObject( 1 , startOfDay ) ;
myPreparedStatement.setObject( 2 , startOfNextDay ) ;

正在检索DATETIME值。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

所有这些已经在Stack Overflow上讨论过很多次了。搜索了解更多信息。

 类似资料:
  • 所以今年早些时候,我在大学里接到了一个任务。任务是使用OOP程序创建一个停车场管理系统。例如,我们学习了如何使用继承、抽象类和实例。我已经完成了并通过了这个作业,所以这个问题只是为了知识目的。其中一个任务是按时间顺序对对象的 Array 列表进行排序。为此,我们学习了可比/比较器方法。但是,我无法理解它,也无法做到这一点。问题是,我们必须对数组列表中的“Vehicle”对象中的“DateTime”

  • 我有两个字符串格式的日期:说,格式为。比较日期1和日期2的相等性的最佳方法是什么?我不关心时间,只关心日、年、月。我应该将它们转换为即时并进行比较吗?

  • 我正在尝试使用Spring MVC、Java和MySql在我的网络应用程序中实现完整的日历插件。当我尝试在我的jsp中使用“输入类型=日期”添加日期时,我一直收到这个错误: 在我的控制器类中,我使用SimpleDateFormat格式化日期: 最后在我的Jsp中: 这是DAO实现: 在我的实体类中,我将变量保存为日期 我认为问题在于日期的解析,但我不确定!对此问题的任何解释都将不胜感激。

  • 问题内容: 我需要在Java中比较两个日期。我正在使用这样的代码: 这是行不通的。变量的内容如下: 包含 包含 我该如何解决? 问题答案: 日期相等性取决于两个等于毫秒的日期。使用创建新的Date对象将永远不会等于过去创建的日期。Joda Time 的API简化了日期的处理。但是,仅使用Java的SDK:

  • 代码: 输出:(增加空白行以提高可读性) 有两件事我不明白: null 我还查看了date.equals()的实现: 那么,为什么返回false,尽管为两个对象都返回了1406498400000? 参考:http://docs.oracle.com/javase/7/docs/api/java/util/date.html#equals(java.lang.object)

  • 目前,我正努力争取与之相比的约会。更重要的是,我有一个属性Death的人,格式是YYYY-MM-DD,如果这个人已经死了(Death 我尝试了以下做法: 但我只收到来自浏览器的解析错误。我使用的是XSL1.0版,除了xmlns:XSL=“http://www.w3.org/1999/XSL/transform”之外,没有任何名称空间。