8

次のような2つのテーブルがあるとします。

Events
ID (PK int autoInc), Time (datetime), Caption (varchar)

Position
ID (PK int autoinc), Time (datetime), Easting (float), Northing (float)

Timeたとえば、参加基準としてフィールドを使用している場合、すべてのイベントとその位置をリストしても安全ですか? すなわち:

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

または、単に datetime 値を比較するだけでも (パラメータ化された値に秒の小数部が含まれている可能性があることを考慮してください - MySQL は常にこれを受け入れています)。

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

MySQL (バージョン 5.6.4 より前) は、ミリ秒を含まない日時フィールドのみを格納することを理解しています。したがって、このクエリは問題なく機能すると思います。ただし、バージョン 5.6.4 の時点で、MySQL が日時フィールドにミリ秒を格納できるようになったことを読みました。

などの関数を使用して datetime 値が挿入されると仮定するとNOW()、ミリ秒が切り捨てられ (<5.6.4)、上記のクエリが機能すると想定されます。ただし、バージョン 5.6.4 以降では、これが機能しない可能性があります。私はそうであり、2 番目の精度に関心があるのはこれからだけです。

誰かが次の質問に答えることができれば、大歓迎です:

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

編集

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

EDIT2

DATETIME2 番目の精度を使用して、フィールドに参加しない理由を提案できる人はいますか?

4

2 に答える 2

5

MySQL開発者は下位互換性を壊したくないようです。したがって、ミリ秒を使用するには、この機能を使用するためにテーブルやSQLなどを明示的に変更する必要があります。

http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html#function_now

NOW([fsp])

MySQL 5.6.4の時点で、0から6までの小数秒の精度を指定するためにfsp引数が指定されている場合、戻り値にはその桁数の小数秒の部分が含まれます。5.6.4より前では、引数はすべて無視されます。

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

MySQL 5.6.4以降では、TIME、DATETIME、およびTIMESTAMP値の小数秒のサポートが、最大マイクロ秒(6桁)の精度で拡張されています。

分数秒の部分を含む列を定義するには、構文type_name(fsp)を使用します。ここで、type_nameはTIME、DATETIME、またはTIMESTAMPであり、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.)
于 2012-06-21T07:33:28.880 に答える
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/

于 2012-06-21T06:22:50.477 に答える