3

VIEW'MM / DD/YYYY'の形式の日付値を含む列がaにあります。

この列にリストした形式の日付値のみが含まれている場合はORDER BY、列にを付けて、TO_DATEその日付でVIEWを並べ替えることができます。

ORDER BY TO_DATE(MY_DATE_COLUMN, 'MM/DD/YYYY') desc

ただし、この列には「MM / DD/YYYY」としてフォーマットされていないデータがあります。

SQLとにかく、列として実現されているこの列を並べ替えることができるようにするために使用するだけDATEですか?

'MM / DD / YYYY'としてフォーマットされていないデータのためにそれは不可能だと思いますが、私は完全にはわかりません...

これを実現するために、に別の列を追加したくありませんVIEW

4

4 に答える 4

5

1つの方法は、日付を手動で確認することです。

order by (case when substr(MY_DATE_COLUMN, 1, 2) between '01' and '12' and
                    substr(my_date_column, 3, 1) = '/' and
                    substr(my_date_column, 4, 2) between '01' and '31' and
                    substr(my_date_column, 5, 1) = '/' and
                    substr(my_date_column, 6, 4) between '1900' and '2100' and
                    len(my_date_column) = 10
               then to_date(MY_DATE_COLUMN, 'mm/dd/yyyy')
          end) desc

これは、2月30日を許可しますが、ほとんどの目的にはおそらく十分です。

本当に必要なのはOracleのIsDate関数ですが、使用できません。

これを投稿した後、もっと簡単な方法があるかもしれないことに気づきました。

order by substr(my_date_column, 6, 4) desc, substr(MY_DATE_COLUMN, 1, 2) desc,
         substr(my_date_column, 4, 2) desc

年、月、日を抽出し、降順に並べ替えるだけです。含まれているものに応じて、日付以外の日付が混在します。ただし、質問者は順序を気にせず、構文エラーを排除しているように見えました。

于 2012-05-24T21:03:43.183 に答える
4

この列に、日付を変換しようとするが例外をキャッチする関数を作成し、それで並べ替えることができます。

例外をネストして、選択した日付にデフォルト設定する前に、変換のためにいくつかの形式を試すこともできます。例えば。

CREATE OR REPLACE FUNCTION my2date( p_str in VARCHAR2) RETURN DATE is

BEGIN
      RETURN to_date( p_str, 'MM/DD/YYYY' );
EXCEPTION WHEN OTHERS THEN
    BEGIN
        RETURN to_date( p_str, 'DD/MM/YYYY');
    EXCEPTION WHEN OTHERS THEN
        RETURN sysdate; /* or some other fixed date - depends on if you want these first or last */
    END;
END;
/

次に、次の句を使用します。

ORDER BY my2date(MY_DATE_COLUMN) desc;
于 2012-05-24T21:16:18.680 に答える
2

データを修正し、さらに悪いデータを防ぐためにトリガーを追加するのはどうですか...またはvarcharの代わりに適切な日付列を追加してください...

于 2012-05-24T21:23:32.990 に答える
2

おそらくこれを達成する最も簡単な方法は、to_date()null(またはのような他のデフォルト値sysdate)を返す独自の関数を定義することです。これが可能なto_dateのは、入力値を処理できないときに例外をスローするだけだからです。

CREATE OR REPLACE FUNCTION to_date_null(date_str IN varchar2, format_mask IN varchar2)
RETURN DATE
IS
  l_date DATE;
BEGIN
  l_date := to_date( date_str, format_mask );
  RETURN l_date;
EXCEPTION
  WHEN others THEN
    RETURN null;
END to_date_null;

order by次に、この関数を句で使用できます

order by to_date_null(MY_DATE_COLUMN, 'MM/DD/YYYY') desc NULLS LAST;

NULLS FIRSTまたはを指定することによりNULLS LAST、日付以外の値を配置する場所を定義できます。

于 2012-05-24T21:25:18.533 に答える