我在MySQL中有一个表,该表的列定义如下:
CREATE TABLE APPOINTMENT(
CD_APPOINTMENT BIGINT NOT NULL,
-- omitted for brevity
APPOINT_DATE DATE NOT NULL
);
我的JPA实体定义为:
@Entity
@Table(name = "APPOINTMENT")
public class Appointment {
protected Long id;
protected Date date = new Date();
// other atributes omitted for brevity
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CD_APPOINTMENT")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Temporal(TemporalType.DATE)
@Column(name = "APPOINT_DATE", columnDefinition = "DATE")
public Date getDate() {
return date;
}
}
在使用Spring时,我受益于Spring Data JPA。接下来,我正在使用Spring Data JPA存储库。
我正在 2019-07-12 (在我的时区[UTC-3])进行测试。
当我跑步时:
appointmentRepository.save(appointment);
约会已成功(或多或少)保存。
好! APPOINT_DATE
列的值为2019-07-12
,是吗?好吧,看起来还可以。
当我跑步时:
SELECT * FROM APPOINTMENT;
检索到的行符合预期:
CD_APPOINTMENT|APPOINT_DATE
--------------|------------
1| 2019-07-12
当我尝试过滤日期之间时,出现了奇怪的部分。
如果我运行我的JPQL:
SELECT ap FROM Appointment AS ap WHERE ap.date BETWEEN :startDate AND :endDate
startDate 和 endDate 是在Spring的@Param批注中接收到的参数,它们都具有 2019-07-12
我得到 0行,但是我希望得到一行(上面插入的约会)。首先,我认为这是JPQL的问题,但不是。如果我用不同的RDBMS(例如,例如H2)执行相同的JPQL,则查询将正常工作。
如果我在SQL中运行相同的JPQL,则直接在MySQL数据库上:
SELECT * FROM APPOINTMENT where APPOINT_DATE BETWEEN '2019-07-12' AND '2019-07-12'
就像JPQL一样,它返回 0行。
如果我在MySQL数据库上运行now();
命令,它将返回正确的日期时间。
我该如何解决? 有人看到过类似的东西吗?因为我没有。
答案 0 :(得分:1)
在“ 2019-07-12”和“ 2019-07-13”之间
答案 1 :(得分:1)
最好不要在日期/时间使用between
。原因之一是因为可能存在引发比较的时间组件。
我建议:
SELECT *
FROM APPOINTMENT
WHERE APPOINT_DATE >= '2019-07-12' AND
APPOINT_DATE < '2019-07-13'
此逻辑适用于不带时间成分的。而且它可以利用date列上的索引。
答案 2 :(得分:0)
我的MySQL实例来自Amazon RDS。
其默认时区为UTC。 从UTC切换到巴西/东部,现在可以正常使用了。