0

実際のタイムスタンプではなくテキストとして値を保存するタイムスタンプというフィールドがあります。残念ながら、ロギング アプリケーションは変更できません。

そう

table.Timestamp -> text field with format -> "Wed Mar 02 13:28:59 CDT 2011"

これをタイムスタンプセレクターとして使用して、最新の行を除くすべてをパージするクエリを開発しています。これは、文字列を日付に変換します->

MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CDT %Y' )

私のクエリは完全に機能します...

ただし、現在の時刻が夏時間かどうかによって、文字列値 -> 'CDT' -> 'CDT' と 'CST' の間で変化することがわかりました。サマータイム中は「CDT」としてログに記録し、その逆も同様です。

したがって、これを実行すると、「CST」を含むすべての行が無視されます->

 MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CDT %Y' )

これを実行すると、「CDT」を含むすべての行が無視されます->

 MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CST %Y' )

両方の文字列形式に対して実行する方法はありますか?

編集 -

したがって、次のデータが与えられます (「CDT」と「CST」のみが異なります。

"Wed Mar 02 13:28:59 CDT 2011" and "Tue Mar 08 09:42:07 CST 2011"

現在、次のように返されます。

 MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ) Returns - Wed Mar 02 13:28:59 CDT 2011

MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) Returns - Tue Mar 08 09:42:07 CST 2011

何があっても「Tue Mar 08 09:42:07 CST 2011」を返したいです。

編集2:

これは私の主なクエリです:

DELETE 
FROM `table` main
WHERE STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) <
  (SELECT  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 `table` sub
   WHERE sub.Retrieving_User = main.Retrieving_User )
4

1 に答える 1

2

2つを合体させます。COALESCEセット内の最初のnull以外の値を返すことを意味します。

この場合、最初に「CDT」を使用して解析を試みます。それが失敗し、NULLを返す場合、代わりに「CST」を使用して解析を試みます。(それが失敗した場合、それは合体リストの最後に到達し、NULLを返すだけですが、あなたの場合はそれほど遠くにはなりません)。

select MAX( COALESCE(STR_To_DATE( test.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ), STR_To_DATE( test.Timestamp , '%a %b %d %H:%i:%s CST %Y' )))
from test

SQL Fiddleテーブルのデータを変更してみて、機能することを確認してください。

于 2012-08-29T15:37:31.947 に答える