2014-04-28 11 views
46

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

एक ही रास्ता मैं इसे अब तक ऐसा करने में सक्षम किया गया है इस तरह है: इस के साथ

SELECT user_id 
FROM user_logs 
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28' 

समस्या मैं तालिका क्वेरी करने से पहले पहली तारीख और अंतिम तारीख की गणना करने के लिए है कि है। क्या ऐसा करने का कोई आसान तरीका है? यदि आप >= start AND < end का उपयोग

धन्यवाद

+0

तुलना में अधिक कुशल होना चाहिए अंतराल हमेशा एक महीने के है या यह हो सकता है, कि आप 15 वें स्थान पर हो सकता है शुरू करने और निम्न में से 7 पर खत्म महीना? – frlan

उत्तर

89

दिनांक (और कई बार) के साथ बहुत सी बातें सरल हो जाते हैं।

उदाहरण के लिए:

SELECT 
    user_id 
FROM 
    user_logs 
WHERE 
     login_date >= '2014-02-01' 
    AND login_date < '2014-03-01' 

इस मामले तुम अब भी महीने आप की जरूरत की आरंभ तिथि की गणना करनी में, लेकिन यह है कि किसी भी तरीके से में सीधे आगे होना चाहिए।

समाप्ति तिथि भी सरल है; बस एक महीने जोड़ें। 28 30 वीं, 31 वीं के साथ के बारे में कोई खिलवाड़, आदि


इस संरचना भी अनुक्रमित के उपयोग को बनाए रखने के लिए सक्षम होने का लाभ दिया है।


बहुत से लोग जैसे कि निम्न एक रूप का सुझाव दे सकते हैं, लेकिन वे ऐसा नहीं उपयोग अनुक्रमित:

WHERE 
     DATEPART('year', login_date) = 2014 
    AND DATEPART('month', login_date) = 2 

इस तालिका में हर पंक्ति के लिए शर्तों की गणना शामिल (एक स्कैन) और पंक्तियों की सीमा को खोजने के लिए इंडेक्स का उपयोग नहीं करना जो मिलान करेगा (एक श्रेणी-खोज)।

+1

पहले दृष्टिकोण को महीनों के साथ गड़बड़ करने की आवश्यकता है (दिनों के बजाय) f.ex. '2014-12-01 'और' 2015-01-01'। दूसरा भी अनुक्रमित किया जा सकता है, लेकिन यह छोटा नहीं है, मैं मानता हूं - 'एक्स्ट्राक्ट()' अधिक compatibe लगता है। – pozs

-7

दस्तावेज़ीकरण पढ़ें।

WHERE 
(
    date_trunc('day',table1.date_eval) = '2015-02-09' 
) 

या

WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) <'2015-02-09')  

Juanitos Ingenier:

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

मुझे लगता है कि जैसे एक प्रश्न का इस्तेमाल किया।

+1

यह वास्तव में सवाल का जवाब नहीं देता है। सवाल महीने और साल के आधार पर तारीखों के लिए पूछता है। – Ram

3

PostreSQL 9.2 Range Types समर्थित हैं। तो अगर आप लिख सकते हैं इस तरह:

SELECT user_id 
FROM user_logs 
WHERE '[2014-02-01, 2014-03-01)'::daterange @> login_date 

इस स्ट्रिंग तुलना

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