CLF 日付書式を日付型に変換する
別の記事で「Apache アクセスログをSQLで読み込む【SQL Server編】」 を投稿しましたが、Apache アクセスログ(CLF)の日付時刻を SQL Server の日付型(datetime)に変換してみたいと思います。CONVERT関数で一発だろうと思いきや、そんな単純な話ではありませんでした。
今回はサンプルとして「02/Sep/2021:14:32:19」を利用しています。
日付型への変換その1
アクセスログ((CLF形式)の日付のフォーマットはISO8601に準拠しているようですが、月名称が英略名称(Jan,Feb,…)になっているのと、日付形式がイギリス式(日/月/年)となっているのが気になります。
まずは単純に「02/Sep/2021」をCONVERT関数を使って変換してみます。
SELECT CONVERT(DATETIME,'02/Sep/2021') AS DT

この日付の形式はデフォルト言語(Japanese)だと認識されないようです。なので、言語(LANGUAGE)を一時的に変更してから同様にCONVERTで変換してみます。
SET LANGUAGE 'British English'
SELECT CONVERT(DATETIME,'02/Sep/2021') AS DT

うまく変換できました。
日付型への変換その2
次に時刻まで含めて変換してみます。つまり「02/Sep/2021:14:32:19」 ですね。
SET LANGUAGE 'British English'
SELECT CONVERT(DATETIME,'02/Sep/2021:14:32:19') AS DT

変換エラーです。(言語を英語に変えているので英語のメッセージになっています)
datetimeの説明を見てもよくわからないのですが、少なくとも日付と時刻の間にコロン(":")があるのが良くなさそうです。最初のコロン(":")を空白(" “)に入れ替えてみました。
SET LANGUAGE 'British English'
DECLARE @dtstr VARCHAR(max) = '02/Sep/2021:14:32:19'
SELECT CONVERT(DATETIME,STUFF(@dtstr, CHARINDEX(':',@dtstr),1,' ')) AS DT

ということで、最終的にはうまく変換できたみたいです。
ですが、この書き方だとプロシジャ内なら良いのですが、SQLに組み込んだりできませんので実践的なものとは呼べません。関数化できると便利だなと思い、作成したところ、、、、

なんと「副作用のある演算子」とやらがあると関数がエラーで作成できません。なんだか SQLServer の関数は制約が多いみたいです。回避可能かどうかについては別記事で書きたいと思います。
ディスカッション
コメント一覧
まだ、コメントがありません