我有一个问题,就是对数据库的查询不能得到正确的结果。
在带有此查询的工作台中:从FECHA\u INICIO所在的表中选择*
但是对于我的JAVA代码,它只显示6条记录,它们是在
FECHA_INICIO
列中有2020-02-01
的记录,在FECHA_FIN
列中它们的值为2020-02-28
。这些列中的任何列中的日期与当月的最后一天或第一天不对应的记录都不会显示它们。这就是问题所在。
这是我在存储库中的JAVA代码:
public interface TableRepository extends CrudRepository<Table, String> {
@Query(value = "SELECT * FROM Table WHERE FECHA_INICIO >= :fechaInicio AND FECHA_FIN <= :fechaFin", nativeQuery = true)
List<Table> findAllBetweenDates(@Param("fechaInicio") Date fechaInicio, @Param("fechaFin") Date fechaFin);
}
我试图查看代码在执行什么查询,但在日志中它只显示了以下内容:
org.hibernate.SQL.logStatement - SELECT * FROM TABLE WHERE FECHA_INICIO >= ? AND FECHA_FIN <= ?
数据库中的两列都是日期类型。如果这段代码在PostgreSQL中的数据库副本中对我有效,请添加这段代码,但在MySQL中,它只显示6条记录,而不是18条记录。你知道会发生什么吗?
编辑:
这是我的实体类:
@Entity
@Table(name = "Table")
public class Table{
@Id
@Column(name = "ID", length = 20)
@NotNull
private String id;
@Column(name = "FECHA_INICIO")
@Temporal(TemporalType.DATE)
@NotNull
private Date fechaInicio;
@Column(name = "FECHA_FIN")
@Temporal(TemporalType.DATE)
@NotNull
private Date fechaFin;
@Column(name = "DESCRIPTION", length = 20)
@NotNull
private String descripcion;
}
据我目前所知,您使用的是java.util。实体和存储库中的日期。请确保您已经用时态(TemporalType.date)注释了实体中的日期字段。
此外,我假设您的java版本是8或更高。如果是这样,那么就值得给出java.time。LocalDatea try.)
希望这会有帮助!
编辑:我今天尝试了本地设置。虽然我无法复制您的特定问题,但在调试模式下运行代码时,我有一些观察结果-
>
MySQL的连接URL需要时区信息serverTimezone=UTC
。当我没有提供此信息时,它在服务器启动时给了我异常。
在控制器中使用java.util.Date
,请求将与时区一起解析。因此,对于下面显示的控制器,如果我使用start Date=2019-01-01,它将转换为一月1, 2019 05:30IST,即它有我的本地时区信息。
@GettMapping(value=“/test”)公共列表
基于以上观察,我觉得问题可能是由于选择了时区造成的。
此后,我更改了java.util。日期
到java.time。控制器、服务、实体和存储库中的LocalDate。此外,我从我的实体中删除了时态(TemporalType.Date)。这次在调试中只选了日期。
**您能否尝试在代码中使用java.time.LocalDate
并共享结果。此外,请按照我在评论部分中提到的那样对您的实体进行更改!**
P、 这可能无法完全解决您的问题,但肯定会有助于进一步调试。
很可能您正在比较日期和时间,并且正在过滤某些行。
示例:
2020-04-23 15:00
2020-04-23 01:00
在执行查询之前,可以使用以下函数格式化日期(开始日期和结束日期)
private Date getFormattedFromDateTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTime();
}
就像@Ritika说的:请尝试使用java.time.*它远比java.util.好*
问题内容: 我有一个数据库表看起来像这样 当我运行此查询时,应该不显示任何行,因为不存在具有value的行: SELECT * FROM tableName WHERE ID =‘101foo2’ 我得到的结果具有相同的ID,但没有单词 如果我的查询是如何显示具有ID的行 问题答案: 您正在混合类型。 是一个整数(或数字)。您正在将其与字符串进行比较。因此,MySQL需要确定用于比较的类型。使用什
我在两个特征类中有两个几何,一个名为“HY90299”,另一个名为“hyboxsdo”,这两个几何不相交。 但是当我在oralce中运行空间查询时, “从 HY90299 t,hyboxsdo g 中选择sdo_relate(t.shape,g.shape ,'mask=ANYINTERACT') ” , 我的预言机版本是11g 追加
您好,我正试图通过基于日期查询“where”来创建一个RESTAPI。我连接postgresql。 我有一个这样的实体 @Entity@Table(name="设备")公共类DeviceEntity{ 这是我的疑问: @存储库公共接口设备存储库扩展了分页和排序存储库{ 运行和测试url后,我得到错误"类型int的坏值:8962101012749336481"
要运行查询,在工具栏中点击 运行 。如果查询语句是正确的,该查询将被运行,如果该查询应该返回数据,结果 选项卡会打开查询返回的数据。如果运行查询时发生错误,运行停止,显示相应的错误信息。 结果 选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格查看 和 表单查看。详细信息请看表查看 器。 提示:Navicat 支持返回 10 个结果集。 注意:你可以通过选择 查看 -> 显示结果 -
你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器和数据库。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用三种模式显示:网格视图、树视图和 JSON 视图。详细信息请参阅数据查看器。 【注意】Navi
你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器、数据库和/或模式。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格视图和表单视图。详细信息请参阅数据查看器。 【注意】Navicat