2011-04-26 20 views
5

En mi proyecto estoy usando una tabla denominada "Compensación" ..... comoPHP y MySql con problema de fecha ...?

+--------------------------------------------------------------+ 
| Id | receiver_Id | compensation |  date   | 
|--------------------------------------------------------------| 
| 1 | 5    | 50%   | 2011-02-15 12:15:00 | 
| 2 | 3    | 40%   | 2011-04-05 18:35:00 | 
| 3 | 3    | 30%   | 2011-04-25 06:24:00 | 
| 4 | 5    | 45%   | 2011-04-21 19:05:00 | 
| 5 | 5    | 60%   | 2011-04-30 12:05:00 | 
....................... 

Aquí el date represents that the compensation is changed on that particular date. Para receiver 5, la compensación es 50% before Feb 15 2011. And the compensation is 45% de the date 15 de febrero de 2011 12:15:01 a 21 de abril de 2011 19: 05: 00`. Y así sucesivamente ....

Aquí Cuando creo invoice para el mes APRIL 2011 para la receiver 5, tengo que usar el compensation as 45% hasta la fecha 21 April 2011 y para 22 April 2011 to 30 April 2011 I have to use 60% como compensación ...

Pero ¿Cómo obtener el compensación por un mes o entre 2 fechas ya que la compensación puede ser modificada varias veces en un mes como id 4 y 5 muestra .......

Por favor, ayúdenme writing SQL para lo anterior O tengo que hacer changes en el table structure para hacerlo simple ......?

Gracias de antemano

Respuesta

5

Esto sería mucho más fácil cuando tu mesa seguimiento tanto de inicio de validez y de fin de validez fechas:

+--------------------------------------------------------------+---------------------+ 
| Id | receiver_Id | compensation |  date_from  |  date_to  | 
|--------------------------------------------------------------|---------------------| 
| 1 | 5    | 50%   | 2011-02-15 12:15:00 | 2011-04-21 19:05:00 | 
| 2 | 3    | 40%   | 2011-04-05 18:35:00 | 2011-04-25 06:24:00 | 
| 3 | 3    | 30%   | 2011-04-25 06:24:00 | 0000-00-00 00:00:00 | 
| 4 | 5    | 45%   | 2011-04-21 19:05:00 | 2011-04-30 12:05:00 | 
| 5 | 5    | 60%   | 2011-04-30 12:05:00 | 0000-00-00 00:00:00 | 
....................... 

A continuación, se puede consultar:

SELECT * FROM compensations 
    WHERE (date_to > $start_of_month OR date_to = 0) 
    AND date_from < $end_of_month; 
+0

date_from bien y date_to son mismo que dar más temprano y últimos parámetros a igual campo en BETWEEN cláusula wit query y si la compensación no ha cambiado, entonces es una compensación válida en la actualidad. La fecha más reciente siempre es válida en esta estructura, por lo que no es necesario cambiar la estructura –

+1

+1. Pero iría con 'SELECT * FROM compensaciones WHERE NOW() ENTRE date_from AND date_to' – Nemoden

+1

@Nemoden: El OP desea consultar todas las filas que se aplican a un mes entero, no aquellas que solo se aplican a un solo momento (como AHORA()) –

1

realidad su columna de fecha se parece más a la fecha y hora no a la fecha, pero a:

select * from yourtable where date between 'yourfirstdate' and 'yourlastdate' 

; sin embargo, tenga en cuenta que si especifica un intervalo reducido en las fechas, su consulta no puede arrojar ningún resultado (incluso con la solución original de Sander Marechal), por lo que sería mejor verificar huecos más grandes o consultar siempre 10 filas nuevas y aplicar la fecha de filtrado en el nivel de código.

+1

Esto no funciona. Por ejemplo, su consulta arrojaría cero resultados para Reciever 5 en el mes de marzo (2011-03-01 a 2011-03-31) mientras que, de hecho, debería devolver la fila ID 1. –

+0

Funciona como si supuestamente funcionara dando resultados entre el rango de fechas y no fuera de rangos, como expliqué. Y como puedo ver ahora, usted ha modificado su consulta para reflejar ese cambio también –

+0

No, no funcionará. 'SELECCIONAR * FROM compensaciones DONDE fecha ENTRE 2011-03-01 Y 2011-03-31' ->' 0 filas devueltas'. El comportamiento correcto de acuerdo con la descripción del OP debería devolver la ID de fila '1'. –

1

la primera SQL buscará el mes en curso/año

la segunda SQL muestra que codificado con un determinado mes/año

SELECT * FROM compensations 
    WHERE YEAR(date) = YEAR(NOW()) AND MONTH(date) = MONTH(NOW()); 


SELECT * FROM compensations 
    WHERE YEAR(date) = '2011' AND MONTH(date) = '4';