Игнорирование года в SQL-запросе с диапазоном дат - PullRequest
7 голосов
/ 29 февраля 2012

Обычно, если я хочу сделать запрос к таблице по диапазону дат, я сделаю это следующим образом:

SELECT DISTINCT c.ID AS 'id' FROM CUST c 
JOIN TICKET t ON s.ID = t.SALE_ID 
WHERE c.ACTIVE_IND = 1 
AND t.DELIV_DATE BETWEEN '01-01-2012' AND '01-02-2012'
ORDER BY t.DELIV_DATE DESC

Теперь мне нужно сделать тот же запрос, но игнорировать год, чтобы я могскажем, с 28 февраля по 2 марта и год не имеет значения.

Я попытался изменить запрос:

SELECT DISTINCT c.ID AS 'id' FROM CUST c 
JOIN TICKET t ON s.ID = t.SALE_ID 
WHERE c.ACTIVE_IND = 1 
AND MONTH(t.DELIV_DATE) BETWEEN  ... AND ... 
AND DAY(t.DELIV_DATE) ... BETWEEN ...
ORDER BY t.DELIV_DATE DESC 

Вышеупомянутый запрос работает нормально, если начальный день меньше конечного.это означает, что если я перейду с 20 февраля по 28 февраля, все будет работать нормально, но если я перейду с 28 февраля на 2 марта, это не сработает.один запрос?

Ответы [ 3 ]

11 голосов
/ 29 февраля 2012
...
AND DATE_FORMAT(t.DELIV_DATE, '%m%d') BETWEEN '0101' AND '0201'
...

Обновление - для обработки диапазона, который повторяется в конце года (замените 0101 и 0201 фактическими переменными, представляющими from и to):

...
AND
  (DATE_FORMAT(t.DELIV_DATE, '%m%d') BETWEEN '0101' AND '0201'
   OR '0101' > '0201' AND
     (DATE_FORMAT(t.DELIV_DATE, '%m%d') >= '0101' OR
      DATE_FORMAT(t.DELIV_DATE, '%m%d') <= '0201'
     )
  )
...
0 голосов
/ 29 июня 2015
if ($dates[0] != '0000-00-00') {    
                        if(str_replace('-','',substr($dates[0],4))<=str_replace('-','',substr($dates[1],4))){
                        $having[] = '   DATE_FORMAT(`birthday`, "%m%d") BETWEEN ? AND ?';                           
                        }else{                              
                        $having[] = '   DATE_FORMAT(`birthday`, "%m%d") >= ? OR
                                        DATE_FORMAT(`birthday`, "%m%d") <= ?';
                        }
                        $params[] = str_replace('-','',substr($dates[0],4));
                        $params[] = str_replace('-','',substr($dates[1],4));                                                        
                    } 

включая пример, когда Даты такие же

0 голосов
/ 29 февраля 2012

скажем, с 28 февраля по 2 мая будет сложнее:

.... AND ((month(DELIV_DATE)=2 and day(DELIV_DATE)>=28) or (month(DELIV_DATE) between 3 and 4) or (month(DELIV_DATE)=5 and day(DELIV_DATE)<=2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...