【问题标题】:Finding the next free time slot寻找下一个空闲时间段
【发布时间】:2012-08-06 10:11:24
【问题描述】:

我有一个数据库表(Hibernate conf 全部完成),

  ResourceRequest( resource, startTime, endTime, status )

在 startTime 和 endTime 之间资源被占用。

问题陈述: 对于 inStartTime 和 inEndTime 的输入,如果下一个可用插槽已被给定插槽占用,我必须找到它。 必须为此编写一个休眠查询。

我能想到的一个快速解决方案是: 将给定资源的资源请求查询到集合中,然后对其进行操作以获取下一个可用槽。

但我想把它作为我最后的手段。任何帮助表示赞赏。

谢谢。

【问题讨论】:

  • 资源被占用时是否有状态值?或者如果一个资源没有被占用,那段时间就没有记录吗?如果not occupied 表示没有记录,是否可以将其更改为具有状态码为未占用的记录?同一资源的两条记录可以重叠吗?最后,你如何代表时代?如果一个资源被占用一小时,从中午开始,有startTime = 12:00和endTime = 13:00是很正常的(包括开始,排他结束) - 你在做什么?
  • @Dems * 没有像占用/未占用这样的标志。 status 栏是用来表示审批状态[这里没有使用] 'resource1' '09/08/2012 12:00' '09/08/2012 13:00' 批准 *记录不会重叠。 * startTime-12:00 和 endTime-13:00 是正常的。但 2 个插槽不重叠。

标签: sql hibernate hql


【解决方案1】:

在 sql 中

SELECT * FROM slots s1 WHERE
    s1.endTime > :inStartTime AND
    not exists (SELECT 1 FROM slots s2 WHERE s2.startTime > s1.endTime AND s2.startTime < DateAdd(s1.endTime, :inEndMinusInStart))
ORDER BY
    s1.startTime


// and criteria to tweak

DetachedCriteria subquery = DetachedCriteria.for(Slot.class)
    .add(<filter on resource>)
    .add(Restrictions.propertyGt("startTime", "s1.endTime"));
    .add(Restrictions.propertylt("startTime", Projections.sqlFunction("dateadd", Projections.property("s1.endTime"), inStartTime - inEndTime, Hibernate.dateTime));

session.createCriteria(Slot.class, "s1")
    .add(<filter on resource>)
    .add(Restrictions.gt(endTime, inStartTime))
    .add(Subqueries.notExists(subquery))

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2018-06-22
    相关资源
    最近更新 更多