查询范围内但特殊情况下的日期范围

时间:2019-07-16 06:40:22

标签: php mysql sql date range

我真的很难从逻辑上考虑日期范围内的事物。

例如:

如果事件A 是第9号到第15号,然后用户搜索第10号到第13号,那么我现在就返回了从第10号到第13号的所有事件用户搜索的内容。

但是,由于事件A 来自9日至15日,因此不会在该搜索中显示,但我希望显示它,因为它仍在9日至15日的范围内。

我希望这是有道理的。

感谢您的帮助。

enter image description here

4 个答案:

答案 0 :(得分:1)

我有一个类似的表,通常会执行以下操作来获取所有结果:

SELECT * 
FROM `events` 
WHERE ('2019-07-10' BETWEEN `start_date` AND `end_date`
   OR '2019-07-13'  BETWEEN `start_date` AND `end_date`);

答案 1 :(得分:1)

重叠的逻辑是,当两个时间跨度都在另一个末端开始时,两个时间跨度就会重叠。

这很容易实现为:

select e.*
from e
where e.start_date < $end_date and
      $start_date < e.end_date;

如果该范围中包含end_date,请改用<=

答案 2 :(得分:1)


SELECT * 
FROM `events` as e
WHERE (  e.date_start BETWEEN [INPUT datestart] AND  [INPUT dateend]
     OR   e.date_end  BETWEEN [INPUT datestart] AND  [INPUT dateend]
    )
;

这将显示日期的可能重叠。

答案 3 :(得分:0)

数组中的wpquery:

 'meta_query' => array(
        array(
            'key' => $metaKey,
            // value should be array of (lower, higher) with BETWEEN
            'value' => array('START_DATE', 'END_DATE'),
            'compare' => 'BETWEEN',
            'type' => 'DATE'
        ),
    )

这是mysql和php中的真实示例:

 $db = getDB();
                $sql = "SELECT
                              DATE(invoice_date) AS invoice_date,
                              COUNT(sage_allsalesbyproduct.id) AS row_count,
                              SUM(sage_allsalesbyproduct.qty) AS total_qty,
                              SUM(sage_allsalesbyproduct.gross) AS total_gross,
                              sage_allsalesbyproduct.productcode,
                              ItemGroup as item_group
                            FROM sage_allsalesbyproduct
                            left join stock s on s.ProductCode = sage_allsalesbyproduct.productcode
                            WHERE
                              invoice_date BETWEEN :fromdate AND :todate
                            GROUP BY productcode
                            order by total_qty desc";
                $stmt = $db->prepare($sql);
                $stmt->bindParam("fromdate", $fromdate, PDO::PARAM_STR);
                $stmt->bindParam("todate", $todate, PDO::PARAM_STR);
                $stmt->execute();
                $feedData = $stmt->fetchAll(PDO::FETCH_OBJ);
                $db = null;
                echo json_encode($feedData);

请记住,MySQL使用yyyy-mm-dd格式存储日期值。此格式是固定的,无法更改。

使用mysql,您还可以执行类似的操作

SELECT *
FROM order_details
WHERE order_date >= CAST('2014-02-01' AS DATE)
AND order_date <= CAST('2014-02-28' AS DATE);