比较A与B两个区间有交集的sql限定条件

本文探讨了SQL中集合[begin,end]与指定月份集合之间的关系,包括子集、交集及非子集非交集的情况,并通过SQL条件表达式进行实例解析。


<!--集合[begin,end] 后简称集合 A  月份以2月份为例-->
<!--2月份集合为[2013-03-01,2013-03-31] 后简称为集合B 必须保证[begin,end]与[2013-03-01,2013-03-31]两个集合之间 -->
<!--存在交集 ,between and是个闭区间  也就是包括等号  如下sql条件控制-->
<!--1.A是B的子集  此时 begin>2013-03-01并且end<2013-0-31-->
<!--2.B是A的子集  此时 begin<2013-03-01并且end>2013-0-31-->
<!--3.B与A存在交集,但不是子集的关系 此时 begin=<2013-03-01<=end 或者  begin=<2013<=end-->


((to_date(#{monthFirstDay}, 'yyyy-mm-dd') between

       to_date(adp.createfunddate, 'yyyy-mm-dd') and

       to_date(adp.closefunddate, 'yyyy-mm-dd'))
    or (to_date(#{monthLastDay}, 'yyyy-mm-dd') between
       to_date(adp.createfunddate, 'yyyy-mm-dd') and
       to_date(adp.closefunddate, 'yyyy-mm-dd'))
    or (to_date(#{monthFirstDay}, 'yyyy-mm-dd') &lt;
       to_date(adp.createfunddate, 'yyyy-mm-dd') and
       to_date(adp.closefunddate, 'yyyy-mm-dd') &lt;
       to_date(#{monthLastDay}, 'yyyy-mm-dd')))
两个区间交集的基本思路是比较两个区间的端点,取它们的重叠部分。以下是使用 C++ 实现求两个区间交集的代码: ```cpp #include <iostream> #include <vector> // 定义区间结构体 struct Interval { int start; int end; Interval(int s, int e) : start(s), end(e) {} }; // 求两个区间交集 Interval intersection(const Interval& a, const Interval& b) { // 计算交集的起始点,取两个区间起始点的最大值 int start = std::max(a.start, b.start); // 计算交集的结束点,取两个区间结束点的最小值 int end = std::min(a.end, b.end); // 如果起始点大于结束点,说明两个区间没有交集 if (start > end) { return Interval(0, 0); // 表示没有交集 } return Interval(start, end); } int main() { // 定义两个区间 Interval a(0, 3); Interval b(1, 3); // 求交集 Interval result = intersection(a, b); // 输出结果 if (result.start == 0 && result.end == 0) { std::cout << "No intersection" << std::endl; } else { std::cout << "Intersection: [" << result.start << ", " << result.end << "]" << std::endl; } return 0; } ``` ### 代码解释 1. **定义区间结构体**:定义了一个 `Interval` 结构体,用于表示一个区间,包含起始点 `start` 和结束点 `end`。 2. **求交集函数**:`intersection` 函数接受两个 `Interval` 类型的参数,通过比较起始点和结束点,计算出交集的起始点和结束点。如果起始点大于结束点,则表示两个区间没有交集,返回一个起始点和结束点都为 0 的区间。 3. **主函数**:定义了两个区间 `a` 和 `b`,调用 `intersection` 函数求它们的交集,并输出结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值