月初月末で範囲選択してデータ抽出をするWhere条件
環境
Oracle 11g
実行テーブル
Create table SALES ( PRODUCTNAME varchar2(20) ,AMOUNT number ,SALESDATE date )
サンプルデータ
insert into SALES values ('M10 ボルト',1000,'2023-6-29'); insert into SALES values ('M10 ボルト',1000,'2023-7-10'); insert into SALES values ('M10 ボルト',1000,'2023-7-20'); insert into SALES values ('M10 ボルト',1020,'2023-7-31'); insert into SALES values ('M10 ボルト',1020,'2023-8-1');
指定の日付で範囲選択する方法
select PRODUCTNAME , AMOUNT , SALESDATE from SALES where SALESDATE >= '2023-07-01' and SALESDATE <= '2023-07-31'
結果
バインド変数も可
select PRODUCTNAME , AMOUNT , SALESDATE from SALES where SALESDATE >= :startdate and SALESDATE <= :enddate
結果
Betweenを使う方法
11gあたりからBetweenが使えます。
大昔9iの時は使えなかったと思いますが、今は普通に使えます。
select PRODUCTNAME , AMOUNT , SALESDATE from SALES where SALESDATE between :startdate and :enddate
月を曖昧検索する方法
ここまでは個別の日付を指定して抽出していました。
この方法では月末(28日29日30日31日)が動的に動いてしまうので、実行するたびにプログラムなどで指定するしかありません。
意外に盲点ですが、月初月末の範囲で抽出する場合は、イコール月を曖昧検索する場合と同じ意味になります。
select PRODUCTNAME , AMOUNT , SALESDATE from SALES where to_char(SALESDATE,'YYYY-MM') like '2023-07'
この方法だと同じフォーマットの日付を渡せるのでプログラムでの処理が不要になります。
さらにこの方法だと副問合せでの抽出もできるようになるので、活用の幅が広がります。
注意点としては月単位で抽出する限定の方法で、細かい日付の指定が想定される場合では使えません。
個人的には月末の処理が多いので月初月末日指定はよくあるケースなので参考にしてみてください