日付betweenの落とし穴

betweenは使いやすいものの、日付で取り扱う時には注意が必要です。

timestamp型で取り扱う場合で、
between {from} and {to}

で、toの部分を日付にすると、その日の0時0分0秒までしか対象になりません。


例)
select *
from (
select to_date('2019-02-14 23:00:00','YYYY-MM-DD hh24:mi:ss') as dat from dual
union
select to_date('2019-02-15 00:00:00','YYYY-MM-DD hh24:mi:ss') as dat from dual
union
select to_date('2019-02-15 10:00:00','YYYY-MM-DD hh24:mi:ss') as dat from dual
)
where dat between date '2019-02-01' and date '2019-02-15'

結果
2019-02-14 23:00:00.0
2019-02-15 00:00:00.0

3つめの2/15 10時のものが出てきません。

これが地味な落とし穴になるので、若干面倒ですが、

where dat >= date '2019-02-01'
and dat < date '2019-02-15' + 1

として、1日後「未満」としています。