Timestampは文字列として保存され、ロギングアプリケーションは変更できないため、これらのクエリでは文字列から日付への変換が必要です。
完全に機能するselectクエリがあります->
(SELECT main.user_id, main.Timestamp
FROM `user_table` main
WHERE STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) <
(SELECT MAX(STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CST %Y' ))
FROM `user_table` sub
WHERE sub.user_id = main.user_id ))
これにより、すべてが選択されますが、最近追加されたユーザーIDとタイムスタンプがテーブルから選択されます。
しかし、これを別のテーブルに挿入しようとすると...そのように->
INSERT INTO user_table_temp (`user_id`, `Timestamp`)
(SELECT main.user_id, main.Timestamp
FROM `user_table` main
WHERE STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) <
(SELECT MAX(STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CST %Y' ))
FROM `user_table` sub
WHERE sub.user_id = main.user_id ))
次のエラーが発生します->
#1411 - Incorrect datetime value: 'Mon Mar 14 16:10:10 CDT 2011' for function str_to_date
これは、私のタイムスタンプが2つの形式で保存されているためです。1つは夏時間以外の時間に「CST」として保存され、もう1つは夏時間の間に「CDT」として保存されます。INSERT INTO SELECTが、クエリ対象とは逆の最初の行に到達すると、上記のメッセージで失敗します。
また、それらをCOALESCEしようとしました。これは、select->を実行するだけでも機能します。
INSERT INTO user_table_temp (`user_id `, `Timestamp`)
(SELECT main.user_id , main.Timestamp
FROM `user_table` main
WHERE COALESCE(STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ), STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' )) <
(SELECT MAX(COALESCE(STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ), STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CST %Y' )))
FROM `user_table` sub
WHERE sub.user_id = main.user_id ))
INSERTでこれが失敗するのに、SELECTは機能するのはなぜですか?