2011-04-26 78 views
5

在我的項目,我使用名爲「賠償」之類帶日期問題的PHP和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 | 
....................... 

這裏date represents that the compensation is changed on that particular date表......。對於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。等等....

這裏當我月APRIL 2011創建invoicereceiver 5,我必須使用compensation as 45%直到日期21 April 201122 April 2011 to 30 April 2011 I have to use 60%作爲補償......

但如何獲得賠償一個月或兩個日期之間的賠償可能會在一個月內修改多次,如ID 4和5顯示.......

請幫我writing SQL爲上述或我必須使changestable 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子句中進行查詢,如果補償沒有改變,則它是當前有效的補償。最新日期在此結構中始終有效,因此無需更改結構 – 2011-04-26 08:05:19

+1

+1。但我會'SELECT * FROM補償現在()之間date_from和date_to' – Nemoden 2011-04-26 08:06:30

+1

@Nemoden:OP想要查詢適用於整個月的所有行,而不是那些只適用於一個時刻(如NOW()) – 2011-04-26 08:13:44

1

實際您的日期列看起來更像日期時間類型不是日期,但是:

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

但是請注意,如果您在日期中指定了較窄的間隔,那麼您的查詢無法返回任何結果(即使使用Sander Marechal原始解決方案),因此更好的選擇是檢查較大的間隙或始終查詢10個最新行並應用代碼級別的日期過濾。

+1

這不起作用。例如,您的查詢將在3月份(2011-03-01至2011-03-31)期間爲Reciever 5提供零結果,而事實上它應該返回行ID 1。 – 2011-04-26 08:16:03

+0

它的工作方式類似於應用程序提供根據我的解釋,日期範圍之間的結果不在範圍之外。正如我現在所看到的,您已經修改了您的查詢以反映該更改 – 2011-04-26 09:03:10

+0

不,它不起作用。 'SELECT * FROM compensation where where date BETWEEN 2011-03-01 AND 2011-03-31' - >'0 rows returned'。根據OP的描述改正行爲應該返回行ID'1'。 – 2011-04-26 11:39:41

1

第一個SQL將獲取的當前月/年

第二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';