Php-MySql查询,根据日期时间选择数据

问题描述:

我想获取具有相同日期的行数。但是,一秒钟必须忽略不计。Php-MySql查询,根据日期时间选择数据

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

(我有一个表名是myTable和datetime列名是date

我希望你能帮助我..

很简单:

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 
+0

但是,我不知道我的表中的日期。我想了解具有相似日期的行数(根据年,日,小时分) – iremce 2012-01-03 19:41:41

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的日期时间......执行“ - ”运行..

+3

您可能回答了错误的问题。 – konsolenfreddy 2012-01-03 19:30:32

尝试这一次,

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; 
+1

我认为你甚至不需要DATE_FORMAT字段,你可以使用'WHERE DATE('2012-01-03 01:01:01')= DATE(my_date)'为每一行2012年01月03日 – kontur 2012-01-03 20:07:48

+0

不错@kontur,我刚刚在我的本地尝试过,它工作。这对我的第一个查询来说是一个可行的选择。 – Aaron 2012-01-03 20:19:08

+0

您可能还喜欢'WHERE DATE(NOW())= myDate'来检查,例如今天或DATE_ADD,从今天开始x天 - 仅在一个旁注上) – kontur 2012-01-03 20:47:53

如果你只需要计算每个日期的行数这将是简单的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字段添加索引来加速此查询。