-
Jak wyjaśniono we wpisie ręcznym dla
DATE_ADD()
:W twoim przypadku, ponieważ
table1.tim
toTIME
wartość, funkcja zwraca ciąg.Ciąg jest zwracany w zestawie znaków i sortowaniu podanym przez
character_set_connection
icollation_connection
. -
Jak wyjaśniono we wpisie ręcznym dla
TIME()
:Ciąg jest zwracany jako ciąg binarny (dlaczego nie używać zestawu znaków połączenia i sortowania jest poza mną — może błąd?).
-
Jak wyjaśniono we wpisie ręcznym dotyczącym konwersji typu w ocenie wyrażenia :
Dlatego podjęte porównanie jest porównaniem ciągów, ale
binary
string nie może być przekształcony do odpowiedniego sortowania dla porównania (ponieważ jego kodowanie nie jest znane). Stąd błąd, którego jesteś świadkiem.
Można wymusić prawidłowe przeprowadzenie porównania przez jawne przesyłanie
jeden lub oba operandy, ale kusiłoby mnie, aby po prostu przerobić klauzulę, aby konwersja odbywała się niejawnie z porównania z TIME
typ:
TIME(table1.dt1 - INTERVAL 1 MINUTE) <= table1.tim