2009-11-09 16 views
14

मुझे SQL क्वेरी के साथ कुछ मदद चाहिए।SQL क्वेरी दो तिथियों के बीच नहीं

मैं तालिका test_table से सभी रिकॉर्ड चुनने की कोशिश कर रहा हूं जो दो तिथियों '200 9-12-15' और '2010-01-02' के बीच फिट नहीं होगा।

यह मेरी मेज संरचना होती है:

`start_date` date NOT NULL default '0000-00-00', 
`end_date` date NOT NULL default '0000-00-00' 

----------------------------- 
**The following record should not be selected:** 

`start_date`, `end_date` 
'2003-06-04', '2010-01-01' 

मेरे प्रश्न:

SELECT * 

FROM `test_table` 
WHERE 

CAST('2009-12-15' AS DATE) NOT BETWEEN start_date and end_date 
AND 
CAST('2010-01-02' AS DATE) NOT BETWEEN start_date and end_date 

किसी भी विचार क्यों मेरी क्वेरी गलत रिकॉर्ड का चयन? मैं की तरह कुछ करने के लिए क्वेरी में मानों का क्रम बदलना चाहिए: किसी भी मदद के लिए

start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE) 

धन्यवाद एक बहुत

+0

यदि आप start_date से पहले नहीं डालते हैं तो इसे काम करना चाहिए। – brandonstrong

उत्तर

25

कोशिश कर के बारे में कैसे:

select * from 'test_table' 
where end_date < CAST('2009-12-15' AS DATE) 
or start_date > CAST('2010-01-02' AS DATE) 

जो सभी तिथि सीमाओं जिस पर सभी अपनी समय अवधि को ओवरलैप नहीं वापस आ जाएगी।

+2

मैं इसके खिलाफ सलाह दूंगा, यहां तक ​​कि मध्यम तालिकाओं पर भी यह क्वेरी वास्तव में धीमी हो जाएगी। – Xnoise

+3

@xnoise - और क्या, प्रार्थना करें, आपका विकल्प है? – MatBailie

+2

क्या आप कृपया बता सकते हैं कि "क्यों नहीं" यहां काम नहीं करता है? –

2

आप का मतलब है कि चयनित पंक्तियों की तिथि सीमा निर्दिष्ट समय अवधि के भीतर पूरी तरह से झूठ नहीं करना चाहिए ? इस मामले में:

select * 
from test_table 
where start_date < date '2009-12-15' 
or end_date > date '2010-01-02'; 

(उपरोक्त सिंटेक्स ओरेकल के लिए है, तो आपका थोड़ा अलग हो सकता है)।

0

कि प्रारंभ_तिथि मान लिया जाये, समाप्ति_तिथि से पहले है

अंतराल [start_date..end_date] नहीं दो तिथियों के बीच का अर्थ है कि या तो वह 2009-12-15 से पहले शुरू होता है या यह 2010-01-02 के बाद समाप्त होता है।

तो फिर तुम बस

start_date<CAST('2009-12-15' AS DATE) or end_date>CAST('2010-01-02' AS DATE) 
1

आप वर्तमान में क्या कर रहे हैं जाँच कर रहा है क्या कर सकते हैं कि क्या न start_date और न ही दिए गए दिनांक की सीमा के भीतर end_date गिरावट।

मुझे लगता है कि आप वास्तव में क्या देख रहे एक रिकॉर्ड है जो उक्त समय अवधि में नहीं फिट करता है। यदि ऐसा है, तो नीचे दी गई क्वेरी का उपयोग करें।

SELECT * 
    FROM `test_table` 
    WHERE CAST('2009-12-15' AS DATE) > start_date AND CAST('2010-01-02' AS DATE) < end_date 
5

आपका तर्क पीछे की तरफ है।

SELECT 
    * 
FROM 
    `test_table` 
WHERE 
     start_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE) 
    AND end_date NOT BETWEEN CAST('2009-12-15' AS DATE) and CAST('2010-01-02' AS DATE) 
0

एक ओवरलैप होने के लिए तालिका की start_date अंतराल समाप्ति तिथि से कम होना चाहिए (यानी इसे अंतराल के अंत से पहले शुरू करना है) और तालिका का end_date अंतराल की प्रारंभ तिथि से बढ़िया होना चाहिए। आपको अपनी आवश्यकताओं के आधार पर < = और > = का उपयोग करने की आवश्यकता हो सकती है।

1

यदि 'not' start_date से पहले रखा गया है तो इसे काम करना चाहिए। कुछ कारणों से (मुझे नहीं पता क्यों) 'बीट' से पहले 'नहीं' रखा जाता है, ऐसा लगता है कि यह सब कुछ वापस कर रहा है।

NOT (start_date BETWEEN CAST('2009-12-15' AS DATE) AND CAST('2010-01-02' AS DATE)) 
संबंधित मुद्दे