0

データベースから次の誕生日を取得しようとしているので、それらの顧客のメーリング リストを作成できます。 $pet_bdate - 管理者は、日付を dateFormat: 'yy-mm-dd' の形式で JQuery datepicker に提供します。 $plus_days - 彼は、日付範囲についても選択できます - 0 から 14 までの選択された日付からプラス日。

サーバー構成: Php v 5.2.17 MySQL v 5.5.23 (そのため、いくつかのより高度な Php 関数は MySql と同様に機能しません)

petbdayDATE型です。

クエリは次のとおりです。

SELECT * FROM `customer` c LEFT JOIN `pet` p ON (c.customer_id = p.customer_id) 
WHERE (DATE_FORMAT(p.petbday, '%m-%d') 
BETWEEN DATE_FORMAT(2014-04-13, '%m-%d') AND DATE_FORMAT(DATE_ADD(2014-04-13, INTERVAL 7 DAY), '%m-%d')) 
GROUP BY c.customer_id ORDER BY firstname, lastname, email

そして、これを作成するPHPコードは次のとおりです。

SELECT * FROM `" . DB_PREFIX . "customer` c LEFT JOIN `" . DB_PREFIX . "pet` p ON (c.customer_id = p.customer_id) 
WHERE (DATE_FORMAT(p.petbday, '%m-%d') BETWEEN DATE_FORMAT(" . $pet_bdate . ", '%m-%d') AND DATE_FORMAT(DATE_ADD(" . $pet_bdate . ", INTERVAL " . $plus_days . " DAY), '%m-%d')) GROUP BY c.customer_id ORDER BY firstname, lastname, email

このクエリは、DB に誕生日がある日付に対してゼロ行を返します。

年を無視するために、フォーマットされた日付をクエリに渡すにはどうすればよいですか?

クエリに渡す前にフォーマットしてみましたが、Php で日付を計算するときは少し混乱しました。

これを解決する方法について何か提案はありますか?

4

3 に答える 3

3

文字列比較の代わりに DAYOFYEAR を使用してみてください。

更新: '2004-04-15' を正しく機能させるには、日付をコロンで囲む必要があることも付け加える必要があります。

于 2013-07-28T20:18:14.920 に答える
0

これが私の解決策です:

SELECT * FROM `customer` c LEFT JOIN `" . DB_PREFIX . "pet` p 
ON (c.customer_id = p.customer_id) 
WHERE (DAYOFYEAR(p.petbday) BETWEEN (DAYOFYEAR('" . $pet_bdate . "')) 
AND (DAYOFYEAR(DATE_ADD('" . $pet_bdate . "', INTERVAL " . $plus_days . " DAY))))
GROUP BY c.customer_id ORDER BY firstname, lastname, email

したがって、DATE RANGEを取得するために、列自体p.petbdayと両方の範囲の日付でDAYOFYEARを使用しました( andigが提案したように)。

$pet_bdate - ORIGINAL STARTING DATE
DATE_ADD('" . $pet_bdate . "', INTERVAL " . $plus_days . " DAY) - ORIGINAL 
STARTING DATE PLUS INTERVAL DAYS

私のMySQLバージョンはv5.5.23なので、 DATE_ADDを使用しました

注: 両方の日付を文字列として渡す必要があります (したがって、一重引用符で囲みます)。

これがお役に立てば幸いです...

于 2013-07-29T12:48:25.660 に答える
-1
  $('input[name="pet_bdate"]').datepicker({
        dateFormat: 'yy-mm-dd',
        yearRange: '2000:2000', // one year - leap year
        changeMonth: true,
        changeYear: false, // NO **Year** drop down box
        numberOfMonths: 1,
        minDate: new Date('2000/01/01'), // START date
        maxDate: new Date('2000/12/31'), // END date
    beforeShow: function(input, instance) {
      var firstDate = new Date('2000/01/01');
            if (this.val != 0) {
              $('input[name="pet_bdate"]').datepicker( 'setDate' , $('input[name="pet_bdate"]').val());
            } else {
              $('input[name="pet_bdate"]"]').datepicker('setDate', firstDate);
            }
    }
    });
  $('#ui-datepicker-div').removeClass('ui-helper-hidden-accessible');
于 2013-08-10T13:49:58.287 に答える