获取范围内的记录和范围内的重叠记录

时间:2017-05-22 08:34:55

标签: php mysql

我有以下数据:

   <?xml version='1.0' encoding='utf-8'?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Body>
            <temp-root:xxxxx_update xmlns:temp-root="http://xx.xxxxx.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <firstname>Kevin</firstname>
                <Status>false</Status>
                <lastname>John</lastname>
                <balance>
                    <tn:balance_InnerSet xmlns:tn="xxxxxxxxxxxxx">
                        <tn:balancesheet>
                            <tn:account>
                                <tn:accounttype>savings</tn:accounttype>
                                <tn:accountno>123456789</tn:accountno>
                            </tn:account>
                        </tn:balancesheet>
                    </tn:balance_InnerSet>
                </balance>
            </temp-root:xxxxx_update>
        </soapenv:Body>
    </soapenv:Envelope>

我的目标是在2016-05-01和2016-05-31之间获取所有日期 以及2016年5月以内的任何记录

因此最终结果:

===============================
PK  | StartDate  |  EndDate
===============================
1   | 2016-05-01 |  2016-05-01
2   | 2016-05-02 |  2016-05-25
3   | 2016-04-01 |  2016-06-01
4   | 2016-02-21 |  2016-06-01
5   | 2016-05-01 |  2016-06-01
===============================

我在考虑以下事项,

===============================
PK  | StartDate  |  EndDate
===============================
1   | 2016-05-01 |  2016-05-01
2   | 2016-05-02 |  2016-05-25
3   | 2016-04-01 |  2016-06-01
5   | 2016-05-01 |  2016-06-01
===============================

但这只是屈服;

SELECT events_sysid, title, startdate, enddate, location, longlat, categoryid 
FROM events
WHERE 1=1 AND isactive = 1 AND userid = 2
AND (DATE(startdate) >= DATE('2017-05-01') AND DATE(enddate) <= DATE('2017-05-31'))

我迷失了如何提取“2016年5月以内的任何记录”

缺失:

===============================
PK  | StartDate  |  EndDate
===============================
1   | 2016-05-01 |  2016-05-01
2   | 2016-05-02 |  2016-05-25    
===============================

3 个答案:

答案 0 :(得分:2)

要查找与May重叠的记录,我们感兴趣的是那些在5月底之前开始并在5月初之后结束的记录:

StartDate <= '2017-05-31' AND EndDate >= '2017-05-01'

换句话说,我们对5月底之后开始的记录和5月初之前结束的记录不感兴趣:

NOT (StartDate > '2017-05-31' OR EndDate < '2017-05-01’)

答案 1 :(得分:0)

答案很简单,您需要提供任何可能的记录,因此您需要检查它是否在月末之前创建并且在5月开始之后结束了

Date(startdate) < "2016-06-01 00:00:00" AND Date(enddate) > "2016-04-30 23:59:59" 

答案 2 :(得分:0)

我从

了解到
  

我的目标是获取2016-05-01和2016-05-31之间的所有日期   任何属于2016年5月的记录

总之,你需要在5月份获得日期,无论它们是在5月开始还是结束。

所以试试这个:

SELECT *
FROM `dateTable` 
WHERE `StartDate` >= '2016-05-01' OR `EndDate` <= '2016-05-31'