【问题标题】:How to search between two datetime in php MySQL?如何在 php MySQL 中的两个日期时间之间进行搜索?
【发布时间】:2021-07-06 22:14:01
【问题描述】:

我在 MySQL(MariaDB) 中有一个名为 reports 的表。有一个(共 5 个)名为 logdate 的列,其类型为 datetime .columns 存储日期和时间 (24 小时格式) 。 例如,这里是该列的样本值

2021-04-10 09:35:00

我必须找到给定日期时间之间的所有报告。

我从 PHP 中的表单数据中得到 4 个变量

$fromdate= $_POST['fromdate'];
$todate= $_POST['todate'];
$fromtime= $_POST['fromtime'];
$totime= $_POST['totime'];

$fromtime$totime 只是整数,其值从 0 到 23 小时。 例如,条件可能是获取 2021 年 4 月 4 日之间的所有数据 从 5 点到 2021 年 4 月 8 日 18 点 2021-04-04 03:00:002021-04-08 18:00:00。永远不会有分钟和秒的条件。

我的问题是如何在 PHP 中构造一个与 MySQL 类型兼容的日期时间,以便我可以拥有良好的(高效,表中有数百万条记录)搜索速度? 例如

$select = "select * from reports where logdate between ? and ? "; 

P.S:我尝试将日期和时间保存为整数作为 unixtime stamp。但是,当我使用strttotime() 转换收到的日期和日期时,由于我的代码中的错误,我面临时间格式问题,因此只能使用日期时间。 如果您有任何提高数据库效率的建议,请提出建议。谢谢

【问题讨论】:

  • 回显 $fromdate 和 $fromtime 以便我们查看
  • 如果 frp,date amd tpdate 只保留时间部分,您如何获取日期部分进行比较?
  • 这是我回显 $fromdate 和 $todate 后得到的结果。 "2021-04-09" "2021-04-12"

标签: php mysql sql datetime


【解决方案1】:

您好,此链接可能有助于优化日期比较 MySQL SELECT WHERE datetime matches day (and not necessarily time)

下面的这个将帮助您使用 strptime() 格式化您的 strtotime()

https://www.php.net/manual/en/function.strptime.php

还要检查您的拼写或拼写错误;你写了"strttotime()" 而不是"strtotime()" 你的str"tto"time 有一个额外的't',它应该是str"to"time,虽然没有双引号

【讨论】:

    【解决方案2】:

    虽然我不能肯定这是最有效的方法,但您可以使用 hour(logdate) 与 $fromdate 和 $todate 进行比较

    $select = "select * from reports where hour(logdate) between ? and ? "; 
    

    但它只会比较小时部分。请提及您如何获取日期部分以进行比较?

    【讨论】:

    • Though I can't say for sure this is the most effective way 好吧,我想我们可以相当肯定地说它不是。 :-|
    【解决方案3】:

    对 WHERE 子句中的字段进行计算不是一个好主意。在这种情况下,MySQL/MariaDB 必须计算这个字段的值来比较它来查看 如果这个 ROW 有这个条件。所以 MySQL 必须读取整个表 FULL TABLE SCAN 并且不能使用任何 INDEX。

    执行此操作的更好方法是将计算存储在修复站点上。然后 MySQL 只计算了一次并且可以使用索引(如果有的话)。

    您可以轻松地使用这样的查询:

    $select = "SELECT * FROM reports where logdate between date(?) + INTERVAL ? HOUR AND date(?) + INTERVAL ? HOUR "; 
    

    测试看看:

    SELECT date('2021-04-05') + INTERVAL 16 HOUR;
    result:
    2021-04-05 16:00:00
    

    【讨论】:

      【解决方案4】:

      这是使用 Bernds 解决方案后对我有用的方法。 我在 php 中构造日期时间字符串

      $fromstr ="$fromdate"." "."$fromtime".":00:00";
      $tostr="$todate"." "."$totime".":00:00";
      

      这是我的查询,日期为 4 月 7 日至 4 月 10 日

      $ select = "SELECT * FROM reports where logdate >= '$fromstr' and logdate <= '$tostr' order by logdate";
      

      回显后

      "SELECT * FROM reports where logdate >= '2021-04-07 3:00:00' and logdate <= '2021-04-10 5:00:00' order by logdate";```
      
      

      但是我不确定是否可以为 logdate 列使用索引并将其用于上述查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-14
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 2021-10-03
        • 1970-01-01
        相关资源
        最近更新 更多