选择BETWEEN日期之间返回错误的结果

时间:2019-07-13 00:26:12

标签: java mysql sql spring spring-data-jpa

我在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();命令,它将返回正确的日期时间。

我该如何解决? 有人看到过类似的东西吗?因为我没有。

3 个答案:

答案 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切换到巴西/东部,现在可以正常使用了。