Sql 基于OneToMany关系和日期选择语句
概述: 我的hbm文件中有这些bean。第一个是一个报告,报告有两个开始日期和结束日期,以及一个排除期间的列表。第二是保留报告的排除期。在这些排除的时段内,报表将关闭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
<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_start
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);