2012-02-28 6 views
7

आम तौर पर अगर मैं मैं इसे इस तरह से करना होगा तिथि सीमा से एक मेज पर एक प्रश्न बनाना चाहते:दिनांक सीमा के साथ SQL क्वेरी में साल की उपेक्षा कर

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 

अब मैं एक ही क्वेरी बनाने की जरूरत है, लेकिन साल को अनदेखा करें, इसलिए मैं 28 फरवरी से 2 मार्च तक कह सकता हूं और इससे कोई फर्क नहीं पड़ता।

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 

क्वेरी से ऊपर ठीक काम करता है, तो शुरू कर दिन समाप्त होने से छोटी है:

मैं क्वेरी को संशोधित करने की कोशिश की। इसका मतलब है कि अगर मैं 20 फरवरी से 28 फरवरी को कहता हूं तो यह ठीक काम करता है लेकिन अगर मैं 28 फरवरी से 2 मार्च तक जाता हूं तो यह काम नहीं करेगा।

इसके लिए कोई समाधान है कि मैं इसे एक ही प्रश्न में कर सकता हूं?

+1

आप DAYOFYEAR और MAKEDATE का उपयोग करें और उन सब को एक ही वर्ष के लिए सेट करना चाहिए। मेकेडेट (1 9 71, डेयॉफीयर (टी। डीईएलआईवीएडीएटी)) दोनों के बीच मेकेडेट (1 9 71, डेयॉफीयर ('01 -01-2012 ')) और मेकेडेट (1 9 71, डेयॉफीयर ('01 -02-2012')) –

+0

के लिए धन्यवाद आप सर्गेई टिप्पणी करते हैं। यह ठीक लगता है लेकिन मौत एपिल के समाधान सरल और कम जटिल लगते हैं। हालांकि मुझे इसके बारे में कुछ और परीक्षण चलाना चाहिए। – Tohid

उत्तर

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

अद्यतन - सीमा है कि हालांकि अंत साल लूप को संभालने के लिए (0101 और 0201 की जगह वास्तविक चर from का प्रतिनिधित्व करने और 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

वहाँ 'to_char()' mysql ??? –

+0

अच्छा और सरल मुझे यह पसंद है। @ सर्गी बेनेर माईएसक्यूएल में डेट_फॉर्मैट –

+0

मैंने DATE_FORMAT() – Aprillion

-1

मई 28 फ़र, का कहना है की सुविधा देता है 2 अधिक जटिल होने के लिए:

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

मुझे लगता है कि ओपी कुछ और सामान्य दिख रहा है। तिथि सीमा लूप साल होने पर भी यह काम नहीं करेगा। –

+0

आपके समय के लिए धन्यवाद लेकिन ईमानदार होने के लिए मैं आपके समाधान के पीछे तर्क को समझ नहीं पा रहा हूं: डी – Tohid

+0

क्या आपने इसे लागू करने का प्रयास किया था? – 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));               
        } 

उदाहरण सहित जब दिनांकों को इस एक ही

संबंधित मुद्दे