2013-07-28 9 views
0

Я пытаюсь получить ближайшие дни рождения из базы данных, чтобы создать список рассылки для этих клиентов. $ pet_bdate - Администратор поставляет дату с датпикером JQuery в формате dateFormat: 'yy-mm-dd'. $ plus_days - Он может также выбрать для дат Диапазон - Plus дней от выбранной даты от 0 до 14.Php MySql запрос на день рождения между датами, игнорирующими год

сервера конфигурации: Php v 5.2.17 MySQL v 5.5.23 (Так несколько более продвинутых Php функции не работают, а также MySql)

колонка petbday имеет тип ДАТА.

Вот запрос:

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 

Этот запрос возвращает ZERO строки на дату, которая имеет дни рождения в БД.

Как передать отформатированную дату для запроса, чтобы игнорировать год?

Я попытался сформировать его перед передачей его на запрос, но когда дело доходит до расчета дат с Php, я немного перепутался.

Любые предложения по устранению этого?

ответ

2

Попробуйте использовать DAYOFYEAR вместо сравнения строк.

Обновление: мне также необходимо добавить, что ваши даты должны быть завернуты в двоеточие, чтобы нормально работать «2004-04-15».

+0

Thanx.Я упомянул об этом в своем решении до просмотра вашего обновления :-) – Jadeye

+0

Это не работает, если вы начинаете/заканчиваете границу года. –

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 

Так что для того, чтобы получить ДАТА RANGE Я использовал DAYOFYEAR (как andig предложил) на самой колонке p.petbday и на обоих диапазоне даты:

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

Я использовал DAT E_ADD, потому что мой MySQL версия v5.5.23

Примечание: Обе даты должны быть переданы в качестве строки (отсюда и одиночные кавычки).

Надеется, что вы нашли это полезным ...

+0

Я все еще не думаю, что это будет работать в полном объеме. 1) DATE_ADD - это функция MYSQL и не имеет ничего общего с PHP. 2) DAYOFYEAR обернется на 365, поэтому вам также нужно будет позаботиться об этом. – andig

+0

Ну это так ... что касается № 1 - вы были правы, и это было исправлено. что касается № 2 - я выбрал фиксированный год, который является високосным годом - 2000, поэтому при выборе даты рождения или диапазона вы можете выбрать любую дату, существующую в календаре. AFAIK MySQL DAYOFYEAR() возвращает день года для даты. Возвращаемое значение находится в диапазоне от 1 до 366, поэтому для тех, кто выбирает док для списка рассылки, это очень удобно ... Я отправлю сценарий jqery datepicker для других ... спасибо за вашу помощь и рекомендации. – Jadeye

-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'); 
Смежные вопросы