社内SEの話

日々起きたことの記録用

【Oracle】月初月末で範囲選択をする

↓プログラミングで副業を考えたらこちら↓

月初月末で範囲選択してデータ抽出をする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'

oracle sql where month

結果

oracle sql where month

バインド変数も可

select
PRODUCTNAME , AMOUNT , SALESDATE
from SALES
where SALESDATE >= :startdate 
and SALESDATE <= :enddate

oracle sql where month

結果

oracle sql where month

Betweenを使う方法

11gあたりからBetweenが使えます。

大昔9iの時は使えなかったと思いますが、今は普通に使えます。

select
PRODUCTNAME , AMOUNT , SALESDATE
from SALES
where SALESDATE between :startdate and :enddate

oracle sql where month

月を曖昧検索する方法

ここまでは個別の日付を指定して抽出していました。

この方法では月末(28日29日30日31日)が動的に動いてしまうので、実行するたびにプログラムなどで指定するしかありません。

意外に盲点ですが、月初月末の範囲で抽出する場合は、イコール月を曖昧検索する場合と同じ意味になります。

select
PRODUCTNAME , AMOUNT , SALESDATE
from SALES
where to_char(SALESDATE,'YYYY-MM') like '2023-07'

oracle sql where month

この方法だと同じフォーマットの日付を渡せるのでプログラムでの処理が不要になります。

さらにこの方法だと副問合せでの抽出もできるようになるので、活用の幅が広がります。

注意点としては月単位で抽出する限定の方法で、細かい日付の指定が想定される場合では使えません。

個人的には月末の処理が多いので月初月末日指定はよくあるケースなので参考にしてみてください