2011-10-28 53 views
7

我必須在兩個表之間相對於同一時間昏迷結果,但由於它們的記錄方式,時間戳會有所不同。 我想獲得類似於的結果示例1但我只能得到帶星號的值,如示例2。 從比較中刪除secods或選擇與最接近的DATETIME值相對應的值的最佳方法是什麼?MySQL選擇DATETIME類似到分鐘

目前我使用此查詢:

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1, Table2 
    WHERE ... conditions for the other parameters of Table1 and Table2... 
    AND Table1.TimeSTamp1 = Table2.TimeStamp2 

上最好的做法有任何建議的熱烈歡迎。


實施例1名

TimeStamp1   ¦ Param1 ¦ TimeStamp2   ¦ Param2 
2011-01-01 00:00:35 ¦ 1  ¦ 2011-01-01 00:00:35 ¦ a  * 
2011-01-01 00:01:35 ¦ 2  ¦ 2011-01-01 00:01:35 ¦ b 
2011-01-01 00:02:37 ¦ 3  ¦ 2011-01-01 00:02:35 ¦ c 
2011-01-01 00:03:31 ¦ 4  ¦ 2011-01-01 00:03:35 ¦ d 
2011-01-01 00:04:32 ¦ 5  ¦ 2011-01-01 00:04:35 ¦ e 
2011-01-01 00:05:38 ¦ 6  ¦ 2011-01-01 00:05:35 ¦ f 
2011-01-01 00:06:36 ¦ 7  ¦ 2011-01-01 00:06:36 ¦ g  * 
2011-01-01 00:07:32 ¦ 8  ¦ 2011-01-01 00:07:35 ¦ h 
2011-01-01 00:08:33 ¦ 9  ¦ 2011-01-01 00:08:35 ¦ i 
2011-01-01 00:09:33 ¦ 10  ¦ 2011-01-01 00:09:33 ¦ l  * 
2011-01-01 00:10:35 ¦ 11  ¦ 2011-01-01 00:10:35 ¦ m  * 
2011-01-01 00:11:29 ¦ 12  ¦ 2011-01-01 00:11:31 ¦ n 

LLL 實施例2

TimeStamp1   ¦ Param1 ¦ TimeStamp2   ¦ Param2 
2011-01-01 00:00:35 ¦ 1  ¦ 2011-01-01 00:00:35 ¦ a 
2011-01-01 00:06:36 ¦ 7  ¦ 2011-01-01 00:06:36 ¦ g 
2011-01-01 00:09:33 ¦ 10  ¦ 2011-01-01 00:09:33 ¦ l 
2011-01-01 00:10:35 ¦ 11  ¦ 2011-01-01 00:10:35 ¦ m 

回答

10

這個MySQL表達給你回DATETIME值與秒歸零。

CONVERT(DATE_FORMAT(table.column,'%Y-%m-%d-%H:%i:00'),DATETIME) 

看看這個。 http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format。所以你可能會得到這樣的查詢:

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1 
    JOIN Table2 ON CONVERT(DATE_FORMAT(Table1.TimeStamp1,'%Y-%m-%d-%H:%i:00'),DATETIME) 
       = CONVERT(DATE_FORMAT(Table2.TimeStamp2,'%Y-%m-%d-%H:%i:00'),DATETIME) 
    WHERE ... conditions for the other parameters of Table1 and Table2... 

但是,要小心。自動生成的時間戳有點像浮點數;當他們中的兩個出現相等時,這只是運氣。將時間戳截斷爲分鐘可能沒有問題,但是從另一個時間戳中減去一個時間戳並比較差異(或差異的絕對值)也可能更好。

此外,此連接將會很慢,因爲它必須對每個值運行第二個截斷函數,因此它不能使用任何索引。

您可以從TIMESTAMPDIFF()中減去另一個時間戳。不過要小心。此功能只能在幾秒鐘內以秒爲單位正確工作;它無礙地溢出(正如我痛苦地發現的那樣)。

您可以嘗試在插入時將時間戳截斷爲分鐘。這將讓你索引它們。

+0

謝謝,TIMESTAMPDIFF使工作。有時候我會得到兩倍的入場費,並且消除它們需要很多時間。我會測試在這種情況下轉換日期是否更快。 –

1
WHERE ... 
AND ABS(UNIX_TIMESTAMP(TimeStamp1) - UNIX_TIMESTAMP(TimeStamp2)) < :threshold: 

其中threshold是幾秒鐘之後就不再需要的匹配(例如60,1分鐘)的數量。

+0

我試了一下,但它花費了太多時間,直到Error 2013 –

1

你可以使用TIMESTAMPDIFF來計算秒日期時間的區別:

SELECT t1.TimeStamp1, t1.Param1, t2.TimeStamp2, t2.Param2 
FROM Table1 t1 
LEFT JOIN Table2 t2 
ON ABS(TIMESTAMPDIFF(SECOND,t1.TimeStamp1,t2.TimeStamp2))<=4 
WHERE ... 

注意到Ollie Jones warning,我測試過TIMESTAMPDIFF的MySQL版本58年1月5日,發現時間戳最多相差無溢出至少10000年。所以也許這個問題已經解決了。