2011-04-26 5 views
5

나는 "보상"과 같은 이름의 테이블 ..... 여기 date represents that the compensation is changed on that particular datePHP와 MySQL에 날짜 문제가 있습니까? 내 프로젝트에서

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

을 사용하고 있습니다. receiver 5의 경우 보상은 50 % before Feb 15 2011. And the compensation is 45 % the date 2011 년 2 월 15 일 12:15:01에서 2011 년 4 월 21 일 19 : 05 : 00까지입니다. 나는 receiver 5의 달 APRIL 2011에 대한 invoice을 만들 때 등등 .... 여기

, I합니다 ... compensation as 45% 날짜 21 April 2011까지 보상 등 22 April 2011 to 30 April 2011 I have to use 60%에 대한

을 사용해야하지만를 얻는 방법 id 4와 5가 보여 주듯이 보상이 한 달에 여러 번 수정 될 수 있기 때문에 한 달 또는 두 날짜 사이의 보상 ...

위의 내용을 writing SQL 도와주세요. changes을 작성해야합니다. table structure 간단하게 ....... 사전에

감사

답변

5

테이블이 모두-유효로부터 날짜 유효-에 추적 할 때 훨씬 쉬울 것 : 그런 다음

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

당신이 조회 할 수 있습니다 실제로

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

잘 date_from 및 DATE_TO 이전주고 같은에 후자의 매개 변수와 동일합니다 필드가 BETWEEN 절 위트 쿼리에 있고 보상이 변경되지 않았다면 현재 유효한 보상입니다. 최신 날짜는이 구조에서 항상 유효하므로 구조를 변경할 필요가 없습니다. –

+1

+1. 그러나 나는'SELECT * FROM compensation '과 함께 갈 것입니다. 지금은 date_from AND date_to와 같습니다. – Nemoden

+1

@Nemoden : OP는 한 달에 적용하는 사람들이 아니라 전체 달에 적용되는 모든 행을 쿼리하려고합니다 (예 : NOW()) –

1

을 날짜 열은 날짜가 아닌 날짜 - 시간 유형과 비슷하게 보이지만, :

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

그러나 좁은 간격을 날짜로 지정하면 쿼리가 결과를 반환 할 수 없으므로 (Sander Marechal 원래 솔루션에서도) 더 큰 간격을 확인하거나 항상 최신 행 10 개를 쿼리하여 적용하는 것이 더 좋습니다 코드 수준에서 날짜 필터링.

+1

이것은 작동하지 않습니다. 예를 들어 3 월에 Reciever 5 (2011-03-01에서 2011-03-31까지)에 대한 결과는 0이지만 행 ID 1을 반환해야합니다. –

+0

주는 것만 큼 효과가 있습니다 내가 설명한 바와 같이 날짜의 범위와 범위를 벗어나는 결과는 없습니다. 그리고 지금 내가 볼 수 있듯이 변경 사항을 반영하도록 쿼리를 수정했습니다. –

+0

아니요, 작동하지 않습니다. 'SELECT * FROM 보상 어디에서 2011-03-01과 2011-03-31' ->'0 rows returned? OP의 설명에 따라 올바른 동작을 행 ID '1'반환해야합니다. –

1

첫 번째 SQL은 2 SQL을 보여줍니다 현재 월/년

가져옵니다 그것은 특정 월/년으로 하드 코딩

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


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