0

where句の日付減算の結果を比較する方法を理解しようとしています。

クライアントはサービスにサブスクライブしているため、終了日を持つサブスクリプションにリンクされています。2週間以内に終了するサブスクリプションのリストを表示したいと思います。私はデータベースを設計しませんでしたが、End_Date列タイプが日付ではなくvarcharであることに気付きました。それを変更することはできません。

私の問題は次のとおりです。たとえば、このリクエストで減算の結果を選択しようとすると、次のようになります。

SELECT(TO_DATE(s.end_date,'YYYY-MM-DD') - TRUNC(SYSDATE)) , s.name  
from SUBSCRIPTION s WHERE s.id_acces = 15 

これは機能し、サブスクリプションの終了から現在の日付までの日数を教えてくれます。

しかし、ここで、比較のためにまったく同じリクエストを句に含めようとすると、次のようになります。

SELECT s.name 
from SUBSCRIPTION S 
WHERE (TO_DATE(s.end_date,'YYYY-MM-DD') - TRUNC(SYSDATE))  between 0 and 16

「ORA-01839:指定された月の日付が無効です」というエラーが表示されます。どんな助けもいただければ幸いです。

4

3 に答える 3

3

表のどこかに、とは異なる方法で日付がフォーマットされていますYYYY-MM-DD。最初のクエリでは、特定の行(または行のセットs.id_acces = 15)をチェックします。これはおそらく問題ありませんが、2番目のクエリではすべてのテーブルをスキャンします。

次のような行でこれらの行を見つけてみてください。

select end_date from subscription 
 where not regexp_like(end_date, '[0-9]{4}-[0-9]{2}-[0-9]{2}')
于 2013-02-07T09:18:46.783 に答える
2

DD 値 (つまり、月の日) を確認してください。この値は、1 からその月の日数までの間でなければなりません。

January - 1 to 31
February - 1 to 28 (1 to 29, if a leap year)
March - 1 to 31
April - 1 to 30
May - 1 to 31
June - 1 to 30
July - 1 to 31
August - 1 to 31
September - 1 to 30
October - 1 to 31
November - 1 to 30
December - 1 to 31
于 2013-02-07T09:23:55.100 に答える
1

「End_Date 列の型は日付ではなく varchar です。変更できません。」

日付を変更できない場合は、データを変更する必要があります。この関数を使用して不正な値を識別できます。

create or replace check_date_format (p_str in varchar2) return varchar2
is
   d date;
begin
   d := to_date(p_str,'YYYY-MM-DD');
   return 'VALID';
exception
   when others then
     return 'INVALID';
end;

この関数をクエリで使用できます。

select sid, end_date
from SUBSCRIPTION 
where check_date_format(end_date) != 'VALID';

選択肢は次のとおりです。

  1. すべての日付が同じ形式になるようにデータを修正する
  2. データを修正し、チェック制約を適用して将来の有効性を強制する
  3. 変換が成功することを期待して、文字列を取り、それに多くの異なる日付形式マスクを適用する特注の MY_TO_DATE() 関数を作成します。
于 2013-02-07T09:24:08.307 に答える