MySQLはDATETIMEを分と同様に選択します

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

3 答え

この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() しかし、注意してください。この機能は、数日以内にタイムスタンプの秒レベルで正常に動作します。それは無礼にあふれています(私が大きな痛みで発見したように)。

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

10
追加された
ありがとう、TIMESTAMPDIFFは仕事をします。時々私は二重のエントリを取得し、それらを削除するには多くの時間がかかります。この場合、日付の変換が速いかどうかをテストします。
追加された 著者 Andrew Strathclyde,

TIMESTAMPDIFF を使用できます。 datetimesの差を秒単位で計算する:

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

1
追加された
WHERE ...
AND ABS(UNIX_TIMESTAMP(TimeStamp1) - UNIX_TIMESTAMP(TimeStamp2)) < :threshold:

threshold は、その後に一致する必要がある秒数です(たとえば、60分= 1分)。

1
追加された
私は試しましたが、2013年までは時間がかかります
追加された 著者 Andrew Strathclyde,