1

基本的に、ユーザーが生年月日をフォーマットで入力した表があります。

日-月-年(2012年12月1日)

表のデータには、そのフィールドが空の人、「DAY-MONTH-YEAR」という単語だけの人、「-」、「-」、「02-12-YEAR」の人など、さまざまなエラーがあります。その他には「--1985」があります。私は知っています...ひどい

私は今、正しい形式で完全な生年月日のみを入力したクエリの人々だけを取得するようにフィルタリングしようとしています。

私の正規表現は素晴らしいものではありません...そして、MySQLで日付を検証する方法について誰かが私を助けてくれるかどうか疑問に思っていました。これはPHPで簡単に実現できましたが、アプリケーションのモデルでこのプロセスを維持しようとしています。

SELECT m_dob FROM `mariners` WHERE m_dob IS NOT NULL AND m_dob != '' and m_dob != 'Day-Month-Year' AND m_dob != '--' AND m_dob REGEXP '^1[() -]*[[:digit:]]{3}[() -]*[[:digit:]]{3}[() -]*[[:digit:]]{4}$';
4

1 に答える 1

7

正規表現を使用する手間を省き、STR_TO_DATE()代わりにMySQLの関数を呼び出すだけです。

SELECT m_dob FROM mariners WHERE STR_TO_DATE(m_dob, '%d-%b-%Y') IS NOT NULL

マニュアルに記載されているように:

から抽出された日付、時刻、または日時の値strが不正な場合は、STR_TO_DATE()戻りNULL、警告が生成されます。


アップデート

STR_TO_DATE()コメントに記載されているように、ゼロの日付を返すことができる状況がいくつかあります。これを回避するには、次のいずれかを行います。

  • NO_ZERO_DATESQLモードを有効にします。

    SET SESSION sql_mode = 'NO_ZERO_DATE'
    
  • またはTO_DAYS、日付の有効性を確認するなどの別の関数を使用します。

    SELECT m_dob
    FROM   mariners
    WHERE  TO_DAYS(STR_TO_DATE(m_dob, '%d-%b-%Y')) IS NOT NULL
    

他のいくつかのコーナーケースが見落とされる可能性が非常に高いため、ゼロの日付を生成する可能性のある入力日付のすべてのインスタンスを手動でキャプチャしようとすることはお勧めしません。

于 2013-03-15T10:30:51.383 に答える