2017-06-12 8 views
0

Oracleデータベースから当月の最初の3日間のレコードを取得する必要があります。以下のような何か、Oracle - 当月の最初の3日間のレコードを取得します

Select * from test.purchase where create_ts=(first 3 days of the current month) 
+0

ようこそ。何を試しましたか? –

+0

私は(3タイムスタンプ)にそれらを提供しようとしましたが、月が変わったときに私はクエリを編集する必要があります。 – karikevinod

答えて

2
Select * 
from test.purchase 
where create_ts between trunc(sysdate,'mm') and trunc(sysdate,'mm') + 3 
+0

これはもちろん、間に 'between'が含まれているので、もちろん4日目の真夜中のレコードも含まれます。 OPのデータの問題ではない可能性があります。またはすべての値が真夜中にある場合、その場合は+ 2が代わりに機能します。 –

3

あなたはMM日付書式要素を使用して、現在の月​​の最初の日を取得することができます。

select to_char(trunc(sysdate, 'MM') + 3, 'YYYY-MM-DD Hh24:MI:SS') from dual; 

TO_CHAR(TRUNC(SYSDA 
------------------- 
2017-06-04 00:00:00 

あなたはまでデータが必要な場合:あなたは、その後のいずれかに日付計算を使用して月の四日を取得する日数またはその数を表す区間を追加することができます

select to_char(trunc(sysdate, 'MM'), 'YYYY-MM-DD Hh24:MI:SS') from dual; 

TO_CHAR(TRUNC(SYSDA 
------------------- 
2017-06-01 00:00:00 

その四日のスタートは、すなわち3日午前23時59分59秒まで、あなたは4日の値について未満真夜中を見ることができます:

select * from test.purchase 
where create_ts >= trunc(sysdate, 'MM') 
and create_ts < trunc(sysdate, 'MM') + 3; 

潜在的にbetweenを使用する可能性がありますが、包括的であるため、3日目に絶対時刻を指定する必要があります。日付またはタイムスタンプであるかどうかをチェックします。 between trunc(sysdate, 'MM') and trunc(sysdate, 'MM') + 3を使用した場合は、4日の真夜中にレコードを含めることになります。これはあなたが望むものではありません。私は>=<を使用していることが分かります。

列は、実際のタイムスタンプである、あなたがあまりにもタイムスタンプするために計算された日付をキャストすることができ、および/または上限のために使用区間場合:

select * from test.purchase 
where create_ts >= cast(trunc(sysdate, 'MM') as timestamp) 
and create_ts < cast(trunc(sysdate, 'MM') + 3 as timestamp); 

...または:

... 
and create_ts < cast(trunc(sysdate, 'MM') as timestamp) + interval '3' day; 
関連する問題