0

我正在尝试从数据库中获取即将到来的生日,以便为这些客户创建一个邮件列表。 $pet_bdate - 管理员使用 JQuery datepicker 以 dateFormat: 'yy-mm-dd' 格式提供日期。 $plus_days - 他还可以从 0 到 14 中选择日期范围 - 加上所选日期的天数。

服务器配置:Php v 5.2.17 MySQL v 5.5.23(所以几个更高级的 Php 功能不如 MySql 好用)

petbday的类型是DATE

这是查询:

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

此查询为数据库中具有生日的日期返回零行

如何将格式化的日期交给查询以便忽略年份?

我尝试在将其提交给查询之前对其进行格式化,但是在使用 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

我使用DATE_ADD因为我的MySQL版本是v5.5.23

注意:两个日期都需要作为字符串传递(因此是单引号)。

希望你发现这很有用...

于 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 回答