PostgreSQLの日付指定の話

会社に新人さんが入ってきたので研修の様子を横目に眺めていた。データ分析主体の会社なので当然SQLから始めるのだけれども、初めてSQLに触れる人はまず確実にDATE()関数で躓いている。自分も躓いた。正しくは、BETWEEN句に日付だけをそのまま入れるおかげで、最後の日付の丸一日分がすっぽり抜け落ちてしまっているのである。

期間に正確にログを取るのであれば(これはpostgreSQLの話であるが)、

WHERE
    timestamp BETWEEN '2018-02-01' AND '2018-02-07'

ではなく、

WHERE
    timestamp BETWEEN '2018-02-01 00:00:00' AND '2018-02-07 23:59:59'

ないし

WHERE
    DATE(timestamp) BETWEEN '2018-02-01' AND '2018-02-07'

の形にしなければならないということ。過去にログを集計した際、間違っているほうのクエリでは、(この例の場合)期間尻に2018-02-07 00:00:00を指定しているのと同じ件数が返ってきたのでそういうことなのだと思う(この辺りは明言している記事が見つからなかったので言葉を濁しておく)。

日付を指定すればそれらしく返ってきそうなものだけど、そのへんはやはり厳しいらしい。研修担当の人が毎回これを教えているので、そろそろ研修資料に入れちゃってもいいんじゃないか、とは思うのだが、初学者にはむしろ一度躓いて調べてみてほしいという部分もあり複雑らしい。あしたはたぶん型変換ですっ転ぶんだろうなとslackの研修進捗報告を見ている。がんばれ。