2011-10-28 12 views
7

2つのテーブル間で同じ時間に比較して結果を比較する必要がありますが、タイムスタンプは記録された方法によって数秒間が異なります。 例1のような結果を得たいと思いますが、例2のように、アスタリスクの値のみを取得します。 比較からセカンドを削除する、または最も近い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... 

ただし、注意してください。自動生成されたタイムスタンプは、浮動小数点数のようなものです。それらのうちの2つがお互いに等しくなると、それはただの運です。タイムスタンプを分単位で切り捨てても問題ありませんが、あるタイムスタンプを別のタイムスタンプから減算して、差分(または差分の絶対値)を比較する方がよい場合もあります。

また、この結合は、すべての値に対して2番目の切り捨て関数を実行する必要があるため、インデックスが使用できないため、処理が遅くなります。

TIMESTAMPDIFF()で別のタイムスタンプから1つのタイムスタンプを差し引くことができます。しかし、注意してください。この機能は、数日以内にタイムスタンプの秒レベルで正常に動作します。それは無礼にあふれています(私が大きな痛みで発見したように)。

タイムスタンプを挿入するときに分単位で切り捨ててみることができます。そうすれば、それらのインデックスを作成できます。

thresholdあなたはもはや一致(例えば60 1分間)の対象となるまでの秒数です
+0

ありがとうございます、TIMESTAMPDIFFが動作します。時々私は二重のエントリを取得し、それらを削除するには多くの時間がかかります。この場合、日付の変換が速いかどうかをテストします。 –

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

+0

私は試しましたが、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に着目し、私はMySQLバージョン5.1.58にTIMESTAMPDIFFをテストし、少なくともまでによって異なるタイムスタンプを持つオーバーフローを発見しました10000年。この問題は修正されている可能性があります。

関連する問題