1

次のクエリがあります。

select * 
  from mytable 
 where to_char(mydate,'mm/dd/yyyy') between ('05/23/2013') 
                                        and ('06/22/2013')

たとえば、毎月変更しないように動的に変更する必要があります05/23/201306/23/2013

('05/23/' + (select to_char(sysdate, 'yyyy') from dual))

しかし、これはエラーを出しています。助言がありますか?

私がしなければならないこと:毎月このクエリを実行して、今月の 23 日から先月23日までのレコードを取得する必要があります。

4

4 に答える 4

4

Oracle は連結演算子||として次を使用します。

('05/23/' || (select to_char(sysdate, 'yyyy') from dual))

ところで、デビッドは正しいです。日付の文字列表現を本当に比較したい場合 (なぜですか?)、日付と同じ順序の日付形式を使用します。

to_char(mydate,'yyyy/mm/dd')
于 2013-07-26T09:53:52.740 に答える
4

日付ではなく文字列に対して比較を実行しているため、コードは思ったようには機能しません。

文字列ロジックに基づくと、「05/23/2000」は「05/22/2013」と「06/24/2000」の間にあります。

データ型を日付として保持すると、Oracle は比較を正しく行います。

おそらくあなたが望むのは:

select *
from   my_table
where  mydate >= add_months(trunc(sysdate,'MM'),-1)+22 and
       mydate <  trunc(sysdate,'MM')+22

しかし、要件が実際に何であるかについての説明がなければ、それを伝えるのは困難です。

于 2013-07-26T09:56:13.963 に答える
0

これはどう?

SELECT '(''05/23/'''||to_char(sysdate, 'yyyy')||'''' FROM DUAL

現在Oracleデータベースがないため、テストしていません。引用符のエスケープを確認する必要があります...

月から正確な日が必要ですか?sysdate から日を減算することもできます。

SELECT (sysdate - 30) FROM DUAL
于 2013-07-26T09:57:21.127 に答える
0

concat 関数を使用することもできます

concat('05/23/', (select to_char(sysdate, 'yyyy') from dual))
于 2013-07-26T09:57:33.657 に答える