2016-05-26 20 views
0

日付を月/年のみにして、fromとdateの間にあるテーブルのレコードを取得できるクエリを作成しようとしています。私が抱えている問題は、開始日と終了日が同じ月/年の場合にレコードを取得しようとすることです。ここで日付が同じ月/年の場合、日付と時刻の間でレコードを取得する方法は?

は私が午前問題の一例です:

select start_date 
from job 
where trunc(start_date) between to_date('05-2016','mm-yyyy') and to_date('05-2016','mm-yyyy') 

をジョブテーブルでは、そこstart_dateの持つレコードは、5月にしているが、それらを見るために私が設定する必要があります現在まで'06 -2016 'に開始日と終了日が05-2016であることを指定するだけで、5月のstart_dateですべてのレコードを取得する方法はありますか?

+0

どのDBMSを使用していますか? –

+0

月の日が指定されていない理由はありますか? to_date('05 -01-2016 '、' mm-dd-yyyy ')とto_date('05 -31-2016'、 'mm-dd-yyyy')の間にはどのようにして月の最後の日を計算するか、またはその日付が月と年だけあなたに供給されるためですか? – shawnt00

+0

Oracle Sqlを指定してください。好ましくは使用しているバージョン(つまり10g) – EoinS

答えて

0

この例では、start_dateのすべてを5/1/2016から5/1/2016の間で選択しています。

1か月ですべてをキャプチャしたいと思われるが、切り捨てる書式は指定していない。 Trunc()に '月'を指定しないと、その日に切り捨てられます。 TRUNC(日付、[FMT])に

select start_date 
from job 
where trunc(start_date,'Month') = to_date('05-2016','mm-yyyy') 

Here is some information:あなたは月に切り捨てたとき、あなたは今、実際にはto_date()ではなく、間にそれが等しくなるように設定することができます。 fmt引数が空白の場合、Trunc()はデフォルトで 'round'に近似しますが、他にも多くのオプションがあります。

指定したい場合は、あなたが間(ただし、ノート使用することができ月間より大きい範囲、これは ')(TO_DATE初to_date()の最初の日から二番目の最初の日である:

select start_date 
from job 
where trunc(start_date) 
between to_date('06-2016','mm-yyyy') 
and to_date('09-2016','mm-yyyy') 
この例では

すべてStart_datesは、2016年6月1日と2016年9月1日の間移入う

を私はこれを行うための最も正確な方法があることだと思う:。

select start_date 
from job 
where trunc(start_date) 
between to_date('06-01-2016','mm-dd-yyyy') 
and to_date('09-30-2016','mm-dd-yyyy') 
0

方法について?

select start_date 
from job 
where trunc(start_date, 'mm') between 
     to_date('05-2016', 'mm-yyyy') 
    and to_date('05-2016', 'mm-yyyy') 

Oracleは今月末に入るものとあなたのbetweenの右端に日付を補間する方法がありません。 to_date()にフォーマットの日の値がない場合、デフォルト値として1stが供給されます。それがあなたが予期していた動作であるかどうかは不明です。

代わりに、月単位で(日付ではなく)日付を切り捨てると、比較には月の最初の日付が含まれます。このように日付が崩れた場合、2つの同じ値の開始と終了を包括的な範囲として扱うことができます。たぶんあなたは、ハードコードされた日付をいくつかの形式のパラメータで置き換えて、これはもっと広い範囲でも機能します。もちろん、betweenは、の場合、常にで1か月間クエリを実行している場合、同等のテストになります。そして、これはあなたのコラムのインデックスを使用するつもりはないので、必ずしも最も効率的ではありません。

私はこれがあなたが探しているものだと思います。その形式で日付の値を指定する必要があるのはなぜですか?おそらく、少しの数学的計算を使ってこれにアプローチするより良い方法があります。

0

は次のように試してみてください。日付の月全体の価値を見るために

select start_date 
from job 
where trunc(start_date) between to_date('05-2016','mm-yyyy') 
and dateadd('d', -1, dateadd('m', 1, to_date('05-2016','mm-yyyy'))) 

は、between句のあなたの日付範囲が長い完全な月である必要があります。

+1

アイデアは健全です。しかし、「間」には1ヶ月が余りにも多く含まれることになります。あなたは厳密に必要なものより少ない。 – shawnt00

+0

@ shawnt00、私はその問題に対処するために私の答えを編集しました。 – BoltBait

関連する問題