基于OneToMany关系和日期

时间:2017-11-28 14:06:02

标签: sql oracle

概述:

我的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>

任务:

选择在选定时间段内启用的所有报告(由startPeriodendPeriod定义)。

我的代码:

SELECT * FROM treport r LEFT OUTER JOIN texcludedperiod ep ON r.m_id=ep.m_treport
WHERE NOT (ep.m_id IS NOT NULL AND (ep.m_start>=startPeriod AND ep.m_end<=endPeriod));

问题:

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

  

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

     

搜索期间:startPeriod 8/1/2000,stopPeriod 9/1/2000。

不应选择此报告。

0 个答案:

没有答案