2009-07-03 13 views
44

मेरे पास तिथियों से जुड़े डेटा के साथ एक MySQL तालिका है। प्रत्येक पंक्ति में डेटा और दिनांक होता है, जैसे:माइस्क्ल: दो तिथियों के बीच सभी डेटा का चयन करें

2009-06-25 75 
2009-07-01 100 
2009-07-02 120 

मेरे पास एक mysql क्वेरी है जो दो तिथियों के बीच सभी डेटा का चयन करती है।

SELECT data FROM tbl WHERE date BETWEEN date1 AND date2

मेरे समस्या यह है कि मैं भी DATE1 और DATE2 भले ही एक दिन के लिए कोई डेटा नहीं है के बीच पंक्तियों प्राप्त करने की आवश्यकता है: इस क्वेरी है।

तो मेरी क्वेरी 2009-06-25 और 200 9-07-01 के बीच खाली तिथियों को याद करेगी।

क्या मैं इन तिथियों को डेटा के रूप में केवल 0 के साथ जोड़ सकता हूं?

उत्तर

4

क्या आपके पास कोई सारणी है जिसमें सभी तिथियां हैं? यदि नहीं, तो आप कैलेंडर तालिका को लागू करने पर विचार करना चाहेंगे और कैलेंडर डेटा पर अपने डेटा में शामिल होने पर बाएं रह सकते हैं।

38

आप ऐसी अवधारणा का उपयोग कर सकते हैं जिसे अक्सर 'कैलेंडर टेबल' के रूप में जाना जाता है।

-- create some infrastructure 
CREATE TABLE ints (i INTEGER); 
INSERT INTO ints VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9); 

-- only works for 100 days, add more ints joins for more 
SELECT cal.date, tbl.data 
FROM (
    SELECT '2009-06-25' + INTERVAL a.i * 10 + b.i DAY as date 
    FROM ints a JOIN ints b 
    ORDER BY a.i * 10 + b.i 
) cal LEFT JOIN tbl ON cal.date = tbl.date 
WHERE cal.date BETWEEN '2009-06-25' AND '2009-07-01'; 

आप तालिका cal बजाय सबसिलेक्ट बनाने के लिए चाहते हो सकता है: Here कैसे MySql में कैलेंडर तालिकाएं बनाने के लिए पर एक अच्छा गाइड है।

+0

जोसेफ: मुझे लगता है कि आप http://www.artfulsoftware.com/infotree/queries.php?&bw=1504#95 – feihtthief

+4

यूआरएल का मतलब बिल्कुल वही हैं, नहीं? –

12
Select * from emp where joindate between date1 and date2; 

लेकिन यह क्वेरी उचित डेटा नहीं दिखाती है।

जैसे

1-jan-2013 to 12-jan-2013. 

लेकिन यह है शो डेटा

1-jan-2013 to 11-jan-2013. 
+2

मैंने इसका उपयोग किया और यह सटीक था क्योंकि मेरे दिनांक फ़ील्ड DATETIME प्रकार के हैं, इसलिए मूल्यों (एक दिन के भीतर डेटा के लिए) में डालने: 'BETWEEN' 2013-10-12 00:00:00 'और' 2013-10 -12 23: 59: 5 9 'काम किया! धन्यवाद महोदय। – arrayown

+1

@ जुलाब, आप तिथि 1 और दिनांक 2 के बीच 'चयन * emp से तारीख (joindate) का उपयोग कर सकते हैं; ' – shweta

10

इसकी बहुत अब इस स्थिति

आप date_sub (के साथ संयोजन में खंड बीच उपयोग कर सकते हैं संभाल करने के लिए आसान() , इंटरवल 30 दिन) और अब()

SELECT 
    sc_cust_design.design_id as id, 
    sc_cust_design.main_image, 
    FROM 
    sc_cust_design 
WHERE 
    sc_cust_design.publish = 1 
    AND **`datein`BETWEEN date_sub(now() , INTERVAL 30 DAY) AND NOW()** 

मुबारक कोडिंग :)

1

आप बच सकते हैं अगर यह .. यह करने नहीं

डेटाबेस वास्तव में इस के लिए नहीं बनाया गया है, तो आप को प्रभावी ढंग से डेटा बनाने के लिए (कोशिश कर रहे हैं एक प्रश्न के भीतर तारीखों की एक सूची के बावजूद)।

किसी भी व्यक्ति जिसके पास डीबी क्वेरी के ऊपर एक आवेदन परत है, वहां सबसे सरल समाधान खाली डेटा भरना है।

आप करेंगे और अधिक से अधिक होने की संभावना क्वेरी परिणामों के माध्यम से वैसे भी पाशन हो सकता है और कुछ इस तरह लागू कर सकते हैं:

loop_date = start_date 

while (loop_date <= end_date){ 

    if(loop_date in db_data) { 
    output db_data for loop_date 
    } 
    else { 
    output default_data for loop_date 
    } 

    loop_date = loop_date + 1 day 
} 

इस के लाभ आंकड़ा संचरण कम हो जाता है; प्रश्नों को डीबग करना आसान, आसान; और कैलेंडर तालिका को बहने की कोई चिंता नहीं है।

1

आप समाप्ति तिथि तक 1 दिन जोड़ना होगा, का उपयोग करते हुए: DATE_ADD('$end_date', INTERVAL 1 DAY)

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