8

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は機能するのはなぜですか?

4

1 に答える 1

0

サポートされている formatを使用していないため、 INSERT で失敗すると思います。サポートされている形式 . . .

「YYYY-MM-DD HH:MM:SS」または「YY-MM-DD HH:MM:SS」形式の文字列として。ここでも「リラックスした」構文が許可されています。日付部分または時間部分の間の区切り文字として、任意の句読点を使用できます。たとえば、「2012-12-31 11:30:45」、「2012^12^31 11+30+45」、「2012/12/31 11*30*45」、および「2012@12@31 11」 ^30^45' は等価です。

'YYYYMMDDHHMMSS' または 'YYMMDDHHMMSS' 形式の区切り文字なしの文字列として、文字列が日付として意味がある場合。たとえば、'20070523091528' と '070523091528' は '2007-05-23 09:15:28' と解釈されますが、'071122129015' は不正 (無意味な分の部分がある) であり、'0000-00-00 00: 00:00'.

YYYYMMDDHHMMSS または YYMMDDHHMMSS 形式の数値として、数値が日付として意味がある場合。たとえば、19830905132800 と 830905132800 は「1983-09-05 13:28:00」と解釈されます。

于 2012-08-30T19:49:54.100 に答える