Sql 基于OneToMany关系和日期选择语句

Sql 基于OneToMany关系和日期选择语句,sql,oracle,Sql,Oracle,概述: 我的hbm文件中有这些bean。第一个是一个报告,报告有两个开始日期和结束日期,以及一个排除期间的列表。第二是保留报告的排除期。在这些排除的时段内,报表将关闭 <class name="com.company.Report" table="TReport"> <property name="startDate" column="m_StartDate" type="timestamp"/> <property name="endDate" c

概述:

我的hbm文件中有这些bean。第一个是一个报告,报告有两个开始日期和结束日期,以及一个排除期间的列表。第二是保留报告的排除期。在这些排除的时段内,报表将关闭

<class name="com.company.Report" table="TReport">
    <property name="startDate" column="m_StartDate" type="timestamp"/>
    <property name="endDate" column="m_EndDate" type="timestamp"/>
    <list name="excludedPeriods" table="TExcludedPeriod" inverse="true" lazy="false">
        <key column="m_TReport" not-null="true"/>
        <list-index column="m_ListIndex" base="1"/>
        <one-to-many class="com.company.ExcludedPeriod"/>
    </list>
</class>
<class name="com.company.ExcludedPeriod" table="TExcludedPeriod">
    <id column="m_Id" name="id" />
    <many-to-one name="report" class="com.company.JobsReport" column="m_TJobReport" not-null="true" />
    <property name="index" column="m_ListIndex" type="integer"/>
    <property name="start" column="m_Start" type="timestamp"/>
    <property name="stop" column="m_Stop" type="timestamp"/>
</class>
问题:

如果一个报告没有排除的期间,或者只有一个这样的期间,那么它可以工作,但在其他情况下,它会选择不应该选择的报告。考虑这个例子d/m/yyyy格式:

报告:2000年1月1日开始,2000年1月2日停止,排除期间: 7/1/2000-10/1/2000、12/1/2000-15/1/2000

搜索周期:开始周期8/1/2000,停止周期9/1/2000


不应选择此报告。

这是您应使用不存在报告的情况之一:

SELECT *
  FROM treport r
  WHERE NOT EXISTS (SELECT *
                      FROM texcludedperiod ep 
                      WHERE ep.m_treport = r.m_id AND
                            ep.m_start >= startPeriod AND
                            ep.m_end <= endPeriod);

基本上,你是说在报告期内给我所有没有排除的报告。

我的大脑停在没有排除的地方。。。这是否转化为:ep.m_id为null或ep.m_startendperiod?我需要相反的不等式,但就是这样,谢谢。现在我必须将其转换为Hibernate标准:D
SELECT *
  FROM treport r
  WHERE NOT EXISTS (SELECT *
                      FROM texcludedperiod ep 
                      WHERE ep.m_treport = r.m_id AND
                            ep.m_start >= startPeriod AND
                            ep.m_end <= endPeriod);