2012-02-28 13 views
7

Normalmente si quiero hacer una consulta en una tabla por rango de fechas que voy a hacer de esta manera:Haciendo caso omiso del año en consultas SQL con el periodo

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 

ahora tengo que hacer la misma consulta pero ignore el año, entonces puedo decir desde el 28 de febrero hasta el 2 de marzo y el año no importa.

He intentado modificar la consulta:

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 

Por encima de consulta funciona bien si el día de inicio es menor que el final. eso significa que si voy desde digamos del 20 de febrero al 28 de febrero funciona bien, pero si voy del 28 de febrero al 2 de marzo no funcionará.

¿Alguna solución para esto que pueda hacer que esto ocurra en una sola consulta?

+1

que puedes usar DAYOFYEAR y MAKEDATE y los puso a todos a mismo año. Diga los dos con ser MAKEDATE (1971, DAYOFYEAR (t.DELIV_DATE)) entre MAKEDATE (1971, DAYOFYEAR ('01 -01-2012 ')) y MAKEDATE (1971, DAYOFYEAR ('01 -02-2012')) –

+0

Gracias por usted comenta Sergey. Parece estar bien, pero las soluciones de deathApril parecen ser simples y menos complicadas. Sin embargo, debería ejecutar otras dos pruebas en él. – Tohid

Respuesta

11
... 
AND DATE_FORMAT(t.DELIV_DATE, '%m%d') BETWEEN '0101' AND '0201' 
... 

actualización - para manejar rango que se repite, aunque el año final (sustituir 0101 y 0201 con variables reales que representan from y 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' 
    ) 
) 
... 
+1

¿hay 'to_char()' mysql ??? –

+0

agradable y simple me gusta. @SergeyBenner MySQL tiene fecha_Formato –

+0

corregí la respuesta para usar DATE_FORMAT() – Aprillion

-1

estancias superiores especificar 28 años desde febrero hasta mayo 2 para ser más complicado:

.... 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) 
+0

Creo que el OP está buscando algo un poco más genérico. Esto tampoco funcionará si el rango de fechas se repite años. –

+0

gracias por su tiempo, pero para ser sincero, no entiendo la lógica detrás de su solución: D – Tohid

+0

¿intentó implementarlo? – Diego

0
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));               
        } 

incluyendo fechas ejemplo, cuando son este mismo

Cuestiones relacionadas