sql >> データベース >  >> RDS >> Oracle

Oracle:有効な月ではありません

    1.

    To_Date(To_Char(MaxDate, 'DD/MM/YYYY')) = REP_DATE
    

    問題を引き起こしています。時間形式なしでto_dateを使用すると、Oracleは現在のセッションのNLS形式を使用して変換します。この場合、「DD / MM/YYYY」ではない可能性があります。これを確認してください...

    SQL> select sysdate from dual;
    
    SYSDATE
    ---------
    26-SEP-12
    
    Which means my session's setting is DD-Mon-YY
    
    SQL> select to_char(sysdate,'MM/DD/YYYY') from dual;
    
    TO_CHAR(SY
    ----------
    09/26/2012
    
    
    SQL> select to_date(to_char(sysdate,'MM/DD/YYYY')) from dual;
    select to_date(to_char(sysdate,'MM/DD/YYYY')) from dual
                   *
    ERROR at line 1:
    ORA-01843: not a valid month
    
    SQL> select to_date(to_char(sysdate,'MM/DD/YYYY'),'MM/DD/YYYY') from dual;
    
    TO_DATE(T
    ---------
    26-SEP-12
    

    2.

    さらに重要なのは、直接比較するのではなく、なぜ文字に変換してから日付に変換するのですか?

    MaxDate = REP_DATE
    

    比較する前にMaxDateの時間コンポーネントを無視する場合は、..

    を使用する必要があります。
    trunc(MaxDate ) = rep_date
    

    代わりに。

    ==更新:更新された質問に基づいています。

    Rep_Date = 01/04/2009 Rep_Time = 01/01/1753 13:00:00
    

    問題はもっと複雑だと思います。 rep_timeが時間のみを対象としている場合、それを日付としてデータベースに保存することはできません。文字列または日付から時間までの間隔、または秒単位の数値である必要があります(Alexのおかげで、これ )。可能であれば、日付と時刻の両方を含む1つの列rep_dateを使用して、それを最大日付列と直接比較することをお勧めします。

    それが実行中のシステムであり、repdateを制御できない場合は、これを試すことができます。

    trunc(rep_date) = trunc(maxdate) and 
    to_char(rep_date,'HH24:MI:SS') = to_char(maxdate,'HH24:MI:SS')
    

    いずれにせよ、時刻は正しく保存されておらず(1753年からわかるように)、今後他の問題が発生する可能性があります。



    1. MySQLのALTERTABLE:味方か敵か?

    2. サブクエリで別のテーブルから特定の行の数を取得する方法

    3. 無効なパラメータ番号:パラメータが定義されていませんデータの挿入

    4. 特定の部門にのみ属するユーザーを選択します