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

日付が無効な場合にエラーを発生させる

    独自のto_date()関数を作成できますが、スキーマ修飾名を使用して呼び出す必要があります。 (私はスキーマ「public」を使用しましたが、それについて特別なことは何もありません。)

    create or replace function public.to_date(any_date text, format_string text)
    returns date as
    $$
    select to_date((any_date::date)::text, format_string);
    $$
    language sql
    

    ベア関数名を使用すると、ネイティブのto_date()関数が実行されます。

    select to_date('20130229', 'yyyymmdd');
    2013-03-01
    

    スキーマ修飾名を使用すると、ユーザー定義関数が実行されます。

    select public.to_date('20130229', 'yyyymmdd');
    ERROR: date/time field value out of range: "20130229"
    SQL state: 22008
    

    私はそれがあなたが探しているものではないことを知っています。しかし 。 。 。

    • ソースからPostgreSQLを再構築するよりも簡単です。
    • 既存のSQLおよびPLPGSQLソースコードの修正は、ストリーミングエディタを使用した簡単な検索と置換です。あなたが本当に望んでいる限り、それは間違いないだろうと私は確信しています。 ネイティブto_date()を使用するたびにpublic.to_date()になります。
    • ネイティブのto_date()関数は引き続き設計どおりに機能します。拡張機能やその他のコードは、そのやや独特の動作に依存している可能性があります。ネイティブ関数の動作を変更する前に、よく考えてください。

    ただし、新しいSQLとPLPGSQLを確認する必要があります。開発者が毎回public.to_date()を書くことを覚えているとは思いません。バージョン管理を使用する場合は、precommitフックを記述して、public.to_date()のみが使用されるようにすることができる場合があります。

    ネイティブのto_date()関数には、文書化されていない動作があります。 2月29日だけでなく、2月345日または2月9999日でも電話をかけることができます。

    select to_date('201302345', 'yyyymmdd');
    2014-01-11
    
    select to_date('2013029999', 'yyyymmdd');
    2040-06-17
    



    1. MySQL length()とchar_length()

    2. MySQLとPHP-一意ではないテーブル/エイリアス

    3. 条件に基づいてカウンターを割り当てる方法

    4. mysqlでの照合エラーの不正な組み合わせのトラブルシューティング