mysql - 如何更新数据库中的日期间隔(Hibernate HQL)

标签 mysql sql sql-server hibernate hql

考虑,对于 id id 的某些特定数据库条目,数据库中的日期间隔,从 BEGIN_DATEEND_DATE,表示为(BEGIN_DATEEND_DATE)。

给定两个构成间隔的新日期 (newBeginDate, newEndDate),我必须更新 (BEGIN_DATE,END_DATE) 以便生成的间隔包含所有 4 个日期。换句话说,我想将这两个间隔相加(并且由于我正在添加它们,结果间隔可能会保持不变或增加,但绝不会缩小)。

几个例子:

如果 (BEGIN_DATE,END_DATE) = (1 月 10 日,1 月 20 日),则:

  • (BEGIN_DATE,END_DATE) + (1 月 15 日,1 月 25 日) = (1 月 10 日,1 月 25 日)

  • (BEGIN_DATE,END_DATE) + (1 月 5 日,1 月 15 日) = (1 月 5 日,1 月 20 日)

  • (BEGIN_DATE,END_DATE) + (1 月 5 日,1 月 25 日) = (1 月 5 日,1 月 25 日)

  • (BEGIN_DATE,END_DATE) + (1 月 15 日,1 月 15 日) = (1 月 10 日,1 月 20 日)

  • (BEGIN_DATE,END_DATE) + (1 月 10 日,1 月 13 日) = (1 月 10 日,1 月 20 日)

以下两个查询共同实现了这个目标。第一个更新 BEGIN_DATE,第二个更新 END_DATE:

session.createQuery(
   "update APPOINTMENTS " +
     "set BEGIN_DATE = :newBeginDate " +
     "where " +
     "(BEGIN_DATE is null or BEGIN_DATE > :newBeginDate) " +
     "and ID = :id ")
           .setParameter("newBeginDate", newBeginDate)
           .setParameter("id", id)
           .executeUpdate();

session.createQuery(
   "update APPOINTMENTS " +
     "set END_DATE = :newEndDate " +
     "where " +
     "(END_DATE is null or END_DATE < :newEndDate) " +
     "and ID = :id ")
        .setParameter("newEndDate", newEndDate)
        .setParameter("id", id)
        .executeUpdate();

我的问题是: 如何在单个查询中完成?

最佳答案

SQL 在涉及更复杂的编程结构时受到限制,因此由于您使用 Hibernate,我将只读取约会实体实例并更新其字段。这将需要两个查询,一个用于读取,一个用于更新,但它仍然只是一个更新语句,并且是最具可读性的解决方案。

如果您仍然只需要一个更新语句而别无其他,则可以使用 case 将您的两个语句合并为一个:

update APPOINTMENTS 
set BEGIN_DATE = case when (BEGIN_DATE is null or BEGIN_DATE > :newBeginDate) then :newBeginDate else BEGIN_DATE end,
    END_DATE = case when (END_DATE is null or END_DATE < :newEndDate) then :newEndDate else END_DATE end
where (BEGIN_DATE is null or BEGIN_DATE > :newBeginDate or END_DATE is null or END_DATE < :newEndDate)
    and ID = :id

关于mysql - 如何更新数据库中的日期间隔(Hibernate HQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441031/

相关文章:

c# - SQL Stored Proc 随着时间的推移消耗内存

sql - 使用sql参数插入值

sql-server - SSIS 运行时存储过程失败

MySql 加入 3 个表以查找每个发票编号的第 3 个(收据)表中的总计(每张发票支付的总额)

php - 想要一并查询帖子和评论吗?

php - 如何从 MySQL 中的表中调用特定行? (见案例)

php - 当我使用嵌套 while 循环从另一个表获取数据时,while 循环只显示一条记录

sql - 在 SQL 中安全地更新计数(字段)

sql - 根据最大id连接表

sql - 错误 : "Multiple columns are specified in an aggregated expression containing an outer reference."