2

このエラーが発生します

操作の照合の不正な組み合わせ<=

次のWHERE句の場合:

time(table1.dt1)<=date_add(table1.tim,interval 60 second)

dt1 = datetimetim = time

誰もが理由を知っていますか?

4

1 に答える 1

2
  1. のマニュアルエントリで説明されているようにDATE_ADD()

    戻り値は引数によって異なります。

    • DATETIME最初の引数がDATETIME(またはTIMESTAMP)値である場合、または最初の引数がaDATEであり、単位値が、、、HOURSまたはMINUTESを使用する場合SECONDS

    • それ以外の場合は文字列。

    あなたの場合、table1.timTIME値であるため、関数は文字列を返します。

    character_set_connection文字列は、とで指定された文字セットと照合で返されますcollation_connection

  2. のマニュアルエントリで説明されているようにTIME()

    時間または日時式の時間部分を抽出しexpr、文字列として返します。

    文字列はバイナリ文字列として返されます(接続文字セットを使用しないのはなぜですか?照合は私を超えています-おそらくバグですか?)。

  3. 式評価での型変換のマニュアルエントリで説明されているように:

    比較操作の両方の引数が文字列の場合、それらは文字列として比較されます。

    したがって、実行される比較は文字列の比較ですが、文字列を比較binaryに適した照合に強制することはできません(エンコードが不明であるため)。したがって、あなたが目撃しているエラー。

オペランドの一方または両方を明示的にキャストすることで、比較を強制的に正しく実行することもできますが、TIME型との比較から暗黙的に変換が行われるように、句を作り直したくなるでしょう。

TIME(table1.dt1 - INTERVAL 1 MINUTE) <= table1.tim
于 2012-08-21T11:29:05.223 に答える