【问题标题】:Php-MySql Query , Selecting Data According to DateTimephp-MySql 查询,根据日期时间选择数据
【发布时间】:2012-02-01 19:13:37
【问题描述】:

我想获取具有相同日期的行数。但是一秒钟必须可以忽略不计。

例如; 2012-01-03 13:12:28 和 2012-01-03 13:12:27 应该被认为是相同的。

(我的表名是myTable,日期时间列名是date

希望你能帮帮我..

【问题讨论】:

    标签: php mysql datetime select


    【解决方案1】:

    很简单:

    SELECT * FROM myTable WHERE date >= '2012-01-03 13:12:27' AND date <= '2012-01-03 13:12:28';
    

    如果你想从一个变量构建它,你可以这样做:

    $date = '2012-01-03 13:12:27';
    $timestamp = strtotime($date);
    $mysqli = new mysqli();
    
    // Note: allowing 1 second either side, this is up to you
    $lower = date('Y-m-d H:i:s', $timestamp - 1);
    $upper = date('Y-m-d H:i:s', $timestamp + 1);
    
    $stmt = $mysqli->prepare('SELECT * FROM myTable WHERE date >= ? AND date <= ?');
    $stmt->bind_param('ss', $lower, $upper);
    $stmt->execute();
    

    编辑:根据您在下面的评论,以下 SQL 应该返回您所追求的内容。请注意,如果日期包含“2012-01-03 13:12:28”,它将同时计入 :27 和 :28。

    SELECT
        upper_date,
        COALESCE(lower_count, 0) + upper_count
    FROM
        (SELECT
            date AS upper_date,
            COUNT(1) AS upper_count
        FROM myTable
        GROUP BY date
        ) AS upper
    LEFT JOIN
        (SELECT
            date - INTERVAL 1 SECOND AS lower_date,
            COUNT(1) AS lower_count
        FROM myTable
        GROUP BY date
        ) AS lower
    ON upper.upper_date = lower.lower_date
    

    【讨论】:

    • 但是,我不知道表中的日期。我想了解日期相似的行数(根据年-月-日-小时-分钟)
    【解决方案2】:
    SELECT p1.date, p1.sex, p2.date, p2.sex, p1.species ......
            FROM table_name AS p1, table_name AS p2
            WHERE p1.date-p2.species in(0,1);
    

    对于这种情况,我们使用带有别名的表的自连接...由于您的条件是日期之间的差异不应超过 1,因此可以...

    我假设你已经将日期存储为mysql datetime...执行“-”操作..

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT count(*)
      FROM myTable
      WHERE DATE_FORMAT(date, '%Y-%m-%d %H:%i') = '2012-01-03 13:12';
      

      或者对于一个组相关的 COUNT:

      SELECT DATE_FORMAT(date, '%Y-%m-%d %H:%i') as myDate, count(*)
      FROM myTable
      GROUP BY myDate;
      

      【讨论】:

      • 我认为您甚至不需要 DATE_FORMAT 该字段,您可以对 2012 年 1 月 3 日的每一行使用 WHERE DATE('2012-01-03 01:01:01') = DATE(my_date)
      • 很好@kontur,我刚刚在我的本地尝试过,它成功了。对于我的第一个查询,这是一个可行的替代方案。
      • 您可能还喜欢WHERE DATE(NOW()) = myDate 来检查,例如,今天,或使用 DATE_ADD,从今天起 x 天 - 只是在旁注中,)
      【解决方案4】:

      如果您只需要计算每个日期的行数,那将是简单的 GROUP BY:

      SELECT COUNT(*) as cnt, DATE_FORMAT(date, '%Y-%m-%d') as my_date
        FROM myTable
        GROUP BY my_date
      

      但是根据您的问题,您不仅需要计算日期内的行数,而且还需要计算不是单个事件而是一系列事件。在这种情况下,您需要定义究竟是什么系列。说一秒钟内的两个事件应该算作一个。如果有四个彼此之间距离为 0.7 的事件怎么办?在这种情况下,我建议分两步计算系列。

      按时间排列的一阶事件:

      SELECT * FROM myTable WHERE date >= XXXX and date < YYYY ORDER BY date ASC
      

      然后在应用程序端,您可以计算两条记录之间的差距,如果两个关闭事件之间的距离超过一秒,则增加计数器。

      不要忘记在date 字段上添加索引以加快查询速度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-14
        • 1970-01-01
        相关资源
        最近更新 更多