2011-04-26 11 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 से 15 फ़रवरी 2011 12:15:01 से 21 अप्रैल 2011 1 9: 05: 00`। और इतना पर ....

यहाँ जब मैं receiver 5 के लिए महीने के APRIL 2011 के लिए invoice बनाने के लिए, मैं compensation as 45% तारीख 21 April 2011 तक और 22 April 2011 to 30 April 2011 I have to use 60% मुआवजे के रूप में के लिए

उपयोग करने के लिए ... है लेकिन पाने के लिए कैसे एक महीने के लिए या क्षतिपूर्ति के बाद से 2 तिथियों के बीच मुआवजा आईडी 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 पहले दे रही है और एक ही करने के लिए बाद के पैरामीटर के रूप में ही कर रहे हैं खंड बुद्धि क्वेरी में क्षेत्र और यदि मुआवजा नहीं बदला है तो यह वर्तमान में वैध मुआवजा है। नवीनतम संरचना हमेशा इस संरचना में मान्य है इसलिए संरचना –

+1

+1 को बदलने की आवश्यकता नहीं है। लेकिन मैं 'चयन * से अब क्षतिपूर्ति के साथ जाऊंगा) (दिनांक) और दिनांक_to' – Nemoden

+1

@ नीमोडेन: ओपी पूरे महीने लागू होने वाली सभी पंक्तियों के लिए पूछना चाहता है, न कि जो एक ही पल पर लागू होते हैं (जैसे अब()) –

1

वास्तव में आपका दिनांक कॉलम डेट-टाइम प्रकार की तारीख की तरह दिखता है लेकिन

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

हालांकि ध्यान रखें कि यदि आप तिथियों में संकीर्ण अंतर निर्दिष्ट करते हैं तो आपकी क्वेरी किसी भी परिणाम (सैंडर मरेचल मूल समाधान के साथ भी) वापस नहीं कर सकती है, इसलिए बेहतर अंतर होगा कि बड़े अंतर को जांचें या हमेशा 10 नवीनतम पंक्तियों को लागू करें और आवेदन करें कोड स्तर में फ़िल्टरिंग तिथि।

+1

यह काम नहीं करता है। उदाहरण के लिए, आपकी क्वेरी मार्च के महीने (2011-03-01 से 2011-03-31) में रेसीवर 5 के लिए शून्य परिणाम देगी जबकि वास्तव में इसे पंक्ति आईडी 1 वापस करनी चाहिए। –

+0

यह काम कर रहा है जैसे काम करना जैसा कि मैंने समझाया है, तिथियों की सीमा के बीच परिणाम और सीमाओं के बाहर नतीजे। और जैसा कि अब मैं देख सकता हूं कि आपने अपनी क्वेरी को संशोधित करने के लिए –

+0

नहीं देखा है, यह काम नहीं करेगा। 'चयन करें * क्षतिपूर्ति से 2011-03-01 और 2011-03-31 के बीच तिथि ->' 0 पंक्तियां वापस आईं। ओपी के विवरण के अनुसार सही व्यवहार पंक्ति आईडी '1' वापस करना चाहिए। –

1

पहले एसक्यूएल चालू माह/वर्ष

लायेगा 2 एसक्यूएल से पता चलता है कि यह एक विशिष्ट माह/वर्ष के साथ हार्डकोडेड

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


SELECT * FROM compensations 
    WHERE YEAR(date) = '2011' AND MONTH(date) = '4'; 
संबंधित मुद्दे