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

Oracle SQL:日付から年の週を抽出すると、ランダムな結果が得られます

    [TL; DR] TO_CHAR( tbl.col, 'IW' )を使用するだけです。

    複数の問題があります:

    1. TO_DATE( string, format_model )を呼び出しています DATEVARCHAR2ではありません )これにより、OracleはDATEの暗黙的な変換を実行します。 VARCHAR2NLS_DATE_FORMATを使用する DATEに戻すことができるようにフォーマットモデルとしてのセッションパラメータ 。つまり、あなたは効果的に次のことを行っています:

      TO_CHAR(
        TO_DATE(
          TO_CHAR(
            tbl.col,
            ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
          ),
          'YYYY/MM/DD'
        ),
        'IW'
      )
      

      これを行わないでください 、使用するだけです:

      TO_CHAR( tbl.col, 'IW' )
      

      その場合、次の問題は関係ありません。

    2. RealCheeseLordが指摘しているように、フォーマットモデルでの年と日の位置は逆になっています。および
    3. YYYYを使用しています 年形式モデルの場合、すべての年が1世紀になります。

      SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt
      FROM   DUAL
      

      出力

      DT
      ----------
      0019-06-17
      

      暗黙の文字列変換を修正しない場合は、おそらく次のいずれかが必要になります。

      TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
      

      または(99年を1999年にするか2099年にするかによって異なります):

      TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
      
    4. MMを使用しています MONのフォーマットモデル フォーマットされたデータ- MMのように、これは必ずしも問題ではありません。 MONにも一致します およびMONTH ただし、おそらく正しいモデルを使用する必要があります。



    1. Laravelアップデートクエリで配列を使用する

    2. 3つのテーブルでjoinを使用する方法

    3. JavascriptフュージョンチャートエクスポートコードをPHP、MySqlコードに適用します

    4. MySQL用のASPNETDB.mdf