2012-06-21 9 views
8

私はそうのような二つのテーブルがあるとし私の参加基準としてTimeフィールドを使用していますか?すなわち:MySQLのDATETIMEカラム上の/比較に参加(<5.6.4 and > 5.6.4)

SELECT E.*,P.* FROM Events E JOIN Position P ON E.Time = P.Time 

OR、偶数単に日時の値(パラメータ化された値は、秒の小数部を含むことができることを考慮 - MySQLは常に受け入れている)と比較例

SELECT E.* FROM Events E WHERE E.Time = @Time 

私はミリ秒なし日時フィールドを格納(バージョン5.6.4前)MySQLを理解しています。だから私はこのクエリはOK機能すると仮定します。しかし、バージョン5.6.4では、MySQLはdatetimeフィールドをミリ秒で保存できるようになりました。 などの関数を使用してdatetime値が挿入されていると仮定すると、ミリ秒は切り捨てられます(< 5.6.4)。しかし、バージョン5.6.4以降では、これが動作しない可能性があります。 私は、2度目の正確さだけに関心があります。

誰もが次の質問に答えることができる場合がいただければ幸いです:一般的には

  1. を、どのようにMySQLは、互いに対する日時フィールドを比較しない( 上記のクエリを検討してください)。
  2. 上記のクエリは問題ありませんか? フィールドにインデックスを使用していますか? (MySQL < 5.6.4)
  3. ミリ秒を除外する方法はありますか?私。挿入時に 条件付き結合/選択など? (MySQL> 5.6.4)
  4. 上記の結合クエリは機能しますか? (MySQLの> 5.6.4)

EDIT

私は、私は日付時刻をキャストすることができます答えているものに感謝を知っているが、私はの根に取り組むためにしようとしていますここでの問題(ストレージの種類/定義が変更されたという事実)と私は自分のクエリで関数を使いたくない。これは、すべてのクエリを書き直す必要はありませんが、インデックスなどを適用するクエリを最適化する私のすべての作業を無効にします。

EDIT2

そこに誰もが第二の精度を使用してDATETIMEフィールドに参加しない理由を提案することはできますか?

+0

だけでなく、あなたの3番目の質問のために、これは私はあなたが合格しない限り、 '5.6.4以降ではミリ秒単位での要因ではないだろう)(NOW'信じるトリック –

+1

を行います。このDATE(time_column)を使用します。たとえば、 "*分数秒の精度*"を示すパラメータ(0-6)であるので、パラメータを 'NOW()'に渡さない限り、結合には問題ないはずです。その他[ここではhttp: /dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_now) –

+0

DATETIMEに使用されるタイムゾーンは、http:// stackoverflowのようにタイムゾーンに「ジャンプ」します。 .com/questions/6841333/why-is-subtracting-these-two-times-in-1927-an-strange-result –

答えて

4

この機能を使用するなど、MySQLの開発者はSQL、あなたが明示的にあなたのテーブルを変更する必要があるので、ミリ秒を使用するように、後方互換性を壊したくなかったようだ:

http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_now MySQLの5.6.4のよう

NOW([FSP])

、FSP引数はを指定するために与えられている場合分数秒の精度が0〜6の間で、戻り値には、その多くの桁のうち、 小数点以下の部分が含まれます。 5.6.4より前の場合、 引数は無視されます。マイクロ秒(6桁) 精度まで有する

http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html

のMySQL 5.6.4およびアップ時間小数秒のサポートを拡張し、 DATETIME、およびTIMESTAMP値:

定義します分数秒の部分を含む列は、type_name(TIME、DATETIME、または TIMESTAMP)の構文type_name(fsp)の を使用し、fspは分数秒の精度です。

CREATE TABLE t1 (t TIME(3), dt DATETIME(6)); The fsp value, if given, must be in the range 0 to 6. A value of 0 signifies that there is no fractional part. If omitted, the default precision is 0. (This differs from the standard SQL default of 6, for compatibility with previous MySQL versions.) 
+0

+1 biziclopに感謝します。 Thats良いニュース、私は何も変更する必要はありません。 – Simon

+0

私はちょうどZane Bienさんのコメントを拡大しました:) – biziclop

1

このクエリを試してみてください。質問3と4については、これは正常に動作します。それでも私があなたに解決策を与えているが、あなたは異なるテーブルで同じ時間を挿入するように制限されますが、

SELECT E.*,P.* FROM Events E JOIN Position P ON date(E.Time) = date(P.Time) 

に参加するために時間フィールドを使用することをお勧めではありません。比較することはできますが、同時に2つの挿入クエリを実行できないため、非常に困難です。だからあなたはこれのためにいくつかのメニューをする必要があります。もっと読んでみたいのなら、この記事を読んでください。

http://billauer.co.il/blog/2009/03/mysql-datetime-epoch-unix-time/

+0

ジョインにタイムフィールドを使用するのは良い習慣ではない理由を説明してください。ありがとう – Simon

+0

私はこのブログの投稿を見てきましたが、 'DATETIME'や' INT'を時間の記憶に使って議論を呼びかけていますが、 'DATETIME'の値を比較するときの正確さの問題にはあまり関係しません。 'JOIN'や単純な等価比較を使用します。 – Simon

+0

DATETIME列の結合が失敗する単純な例:両方の挿入が同時に起こることはないので、それらの間に(小さな)遅延がある可能性があります。最初の挿入が19:59:59.999(ミリ秒に注意)で、19:59:59に切り捨てられ、2番目の挿入が20:00:00.000で1ミリ秒後に20:00に切り捨てられると仮定します:00。今すぐあなたの参加で幸運。これは、実際には挿入クエリで 'NOW()'を使用していることを前提としています。両方のクエリで等しい事前計算された時間値ではありません。 – Bart