2010-12-20 12 views
1

私は毎日実行し、特定の年齢に達するメンバーをチェックするスクリプトを設定しています - CMSで自動化されたメールを設定し、年齢や年齢。これをPHPとMySQLで処理するには、メソッドのパラメータとして月数が渡されます。これについては以下で説明します。しかし、私はこれについて最も簡単な方法で行くのか分からない!英国の日付書式の書式設定のために、私はstringをdatetimeからunixのタイムスタンプに変換して比較しています。 誰もこれについてもっと良い方法を見つけることができますか?おかげ列が MySQL日付比較アドバイス

  • は、英国の日付形式を使用していない日付または日時を入力する

     // If num of months provided is a year, make calculation based on exact year 
         if ($age_in_months % 12 == 0) 
         { 
          // Using 365 days here (60 * 60 * 24 * 365 = 3153600) 
          $clause = 'WHERE ROUND((UNIX_TIMESTAMP() - UNIX_TIMESTAMP(STR_TO_DATE(dob, "%d/%m/%Y")))/31536000) = ' . $age_in_months; 
         } 
         else 
         { 
          // Using 30 days as avg month length (60 * 60 * 24 = 86400) - convert months to days 
          $clause = 'WHERE ROUND((UNIX_TIMESTAMP() - UNIX_TIMESTAMP(STR_TO_DATE(dob, "%d/%m/%Y")))/86400) = ' . $age_in_months * 30; 
         } 
    
  • +0

    愚か者ではありません。適切な形式で日付を保管してください。それが最初にやらなければならないことです。 –

    +0

    下記のコメントを参照してください。日付の保存形式 – spinozf

    答えて

    4
    • 変更、その列にISO-8601形式
    • とインデックスを使用
    +0

    こんにちは、私は仕事が必要な既存のデータベースであるため、残念ながら英国のフォーマットに悩まされています - 私は通常、データストレージにUNIXタイムスタンプを使用します。 – spinozf

    0

    私だけだろうMySQLの日付ロジックを使用します。あなたはこの本嘘卑劣なこととDOB列がテキストとして保存されているという事実を使用することができます。

    は、英国の日付のような形式に、これは現在の日付を取る
    SELECT whatever FROM users WHERE dob LIKE DATE_FORMAT(CURDATE(), '%d/%m/%%'); 
    

    (%%は単一%に変わります) 。今日(私が投稿したように)それは'20/12 /% 'になるでしょう。それはdobのLIKEのためにそれを使用し、あなたに20/12 /(何か)の誕生日を与えます。

    ちょっと変わっていますが、実際にはDOBをテキスト形式で保存することを利用しています。あなたがあまりにも多くの人を持っていなければ、あなたはそれなしで逃げることができますが、私はDOBのインデックスを想定しています。

    2番目のクエリでは、「6か月前に生まれた人」型のものを実行しようとしているようです。そうですか?

    SELECT whatever FROM users WHERE DATE_ADD(CURDATE(), INTERVAL -6 MONTH) = STR_TO_DATE(dob, '%d/%m/%Y'); 
    

    それはきれいではありませんだし、数ヶ月前に...あなたが6に生まれた人、18、30をしたい場合、それは動作しません:あなたはこのようなものができました。その場合、私は実際にあなたが持っているもののようなものに行くでしょう。それは理想的ではありませんが、多かれ少なかれ動作し、結果はあなたのために十分に近いかもしれません。

    0

    datediff(now(),dob)は、2つの日付の間の日数を示します。

    あなたは誰かが少なくとも18であるかどうかを確認したい場合は、2月に生まれif (date_sub(now(),18 years) > dob)

    みんなを試してみてください? if (month(dob) = 2)

    http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

    編集を参照してください:あなたは(計り知れない理由のために)で日付の書式ではありません日付を示すデータベースを立ち往生しているので、あなたのSTR_TO_DATE(dob...セクションでDOBを交換してください。