2012-01-03 96 views
3

我想獲取具有相同日期的行數。但是,一秒鐘必須忽略不計。Php-MySql查詢,根據日期時間選擇數據

例如; 2012-01-03 13:12:28和2012-01-03 13:12:27應該被認爲是一樣的。

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

我希望你能幫助我..

回答

3

很簡單:

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

0
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

0

嘗試這一次,

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

0

如果你只需要計算每個日期的行數這將是簡單的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字段添加索引來加速此查詢。