![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-a9et5szYZ7OuUDr1l3cTO6c2o5auh9amE075nH0o1U-hq_E2PItFbc6DCgGt9Bx_zCbIDla2SdeaToWqYLT1hiLkD36b6DWs1fucIYwcbfNfWeS6x9T2HIy1jmbt67fo9f8JNjtvX4lEMCMsEqxt0mj8CLfwbfnne7mj_asxanfVzxeysQEpZHoXRmA/s1600/sql.png)
仕事でとあるシステムを作っていた時に、データベースにロギングする値を書き換える作業があったのだが、バッチ処理でバリバリ書いていく、いわゆるログデータでした。
このログデータ、あとで見直してみたところ、日付フォーマットが、次のように間違ったフォーマットになっていたのである。
【正解】 2024-01-01 12:01:23
【誤り】2024-01-01 12-01-23
アホなミスですね。
PHPで書き込んでいたんですが、SQLiteだったために、Dateフォーマットなんていう便利な型が無く、エラーも出ずに延々ログとして書き込まれていました。
同一テーブルの値を書き換えるSQL文
まず最初に思いついたのが、正規表現を使って、日付はそのまま、時刻の箇所のセパレータを書き換えるという方法でしたが、
SQLITEは、デフォルトでRegexp機能は入っていません。
拡張させてもいいのですが、日付フォーマットなので、文字列長が同じだし、書き換えポイントが同じということで、次のコマンドを実行することで、書き換えが出来た。
UPDATE Logs
SET date = substr(date, 1,13) ||':'|| substr(date, 15,2) ||':'|| substr(date, 18,2);
文字列の一をちゃんとカウントしておけば、問題ないですよ。
ちなみに、substrは、カウント1スタートなので、要注意です。