6

基本的に、先月のすべてのレコードを (特定のフィルターを使用して) フェッチするクエリがあります。私は Oracle の interval キーワードを使用していますが、今日 (2009 年 12 月 31 日) まではすべて問題なく機能していました。私が使用しているコードは

select (sysdate - interval '1' month) from dual

そして私が得るエラー

ORA-01839: date not valid for month specified

interval キーワードを使用して任意の日付と互換性を持たせるにはどうすればよいですか? または、誰かが問題にアプローチするためのより良い方法を持っている場合、私はすべて耳を傾けます.

ありがとうございました。

4

2 に答える 2

12

試す

select add_months(sysdate,-1) from dual
于 2009-12-31T13:27:49.707 に答える
2

衒学的であること...

要件は完全に明確に指定されているわけではありません。「先月以内」とはどういう意味ですか? ほとんどの人はそれを「現在の暦月内」を意味すると解釈します。その場合、次のように使用します。

TRUNC(SYSDATE,'MM')

それ以外の場合は、現在の日付から 1 か月前の任意の期間が必要になる可能性がありますが、それをどのように定義しますか? おわかりのようINTERVAL '1' MONTHに、日付の月の部分から 1 を引くだけです。たとえば、15-JAN-2009 - INTERVAL '1' MONTH1999 年 12 月 15 日を返します。一部の日付では、すべての月の日数が同じではないため、無効な日付になります。

ADD_MONTHSは、月の最終日を返すことでこれを解決します。たとえば、ADD_MONTHS(31-DEC-2009,-1)30-NOV-2009 を返します。

もう 1 つの可能性は、ビジネスが実際に平均的な月の期間を使用したいということです。たとえば、約 30.4 である 365/12 です。SYSDATE-30もちろん、これを 12 回繰り返しても 1 年のうち 360 日しかカバーできませんが、 を使用してほしいと思うかもしれません。

于 2010-01-01T00:41:06.823 に答える