【问题标题】:Query Date Ranges Within a Range but special case查询范围内的日期范围但特殊情况
【发布时间】:2019-11-24 20:15:07
【问题描述】:

我真的很难从逻辑上思考日期范围的事情。

例如:

如果 事件 A 是第 9 到 15 日,然后用户搜索第 10 到 13 日,那么目前我已经得到它返回从第 10 日到第 13 日开始的所有事件用户搜索的内容。

但是因为 事件 A 是从 9 日到 15 日,所以它不会显示在该搜索中,但我希望它显示,因为它仍在 9 日到 15 日的范围内。

我希望这是有道理的。

感谢任何帮助。

【问题讨论】:

  • 你能分享一些表结构和你当前使用的查询吗?最好创建一个数据库小提琴。
  • 您使用什么操作来捕获范围?在哪里?
  • @Qirel 刚刚用 db layout mate 更新了帖子。
  • @tcadidot0 我正在使用 WP_Query 但尚未编写此部分,但我正在考虑使用 BETWEEN 比较,但不太确定这是否可行,

标签: php mysql sql date range


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    重叠的逻辑是当两个时间跨度都在另一个结束之前开始时重叠。

    这很容易实现:

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

    如果end_date 包含在该范围内,请改用&lt;=

    【讨论】:

      【解决方案3】:
      
      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]
          )
      ;
      
      

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

      【讨论】:

      • 谢谢伙计。你知道我会如何把它写成 WP META 查询吗?
      【解决方案4】:

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        相关资源
        最近更新 更多