तिथि सीमाओं के बीच Postgresql क्वेरी


126

मैं अपने postgresql db को परिणामों की वापसी के लिए क्वेरी करने की कोशिश कर रहा हूं, जहां एक निश्चित महीने और वर्ष में तारीख होती है। दूसरे शब्दों में, मैं एक महीने-वर्ष के लिए सभी मूल्यों को पसंद करूंगा।

एकमात्र तरीका जो मैं अब तक कर पा रहा हूं वह इस प्रकार है:

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

इसके साथ समस्या यह है कि मुझे टेबल को क्वेरी करने से पहले पहली तारीख और आखिरी तारीख की गणना करनी होगी। क्या ऐसा करने का एक सरल तरीका है?

धन्यवाद


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

जवाबों:


202

यदि आप उपयोग करते हैं तो तिथियों (और समय) के साथ कई चीजें सरल हो जाती हैं >= start AND < end

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

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। दूसरा भी अनुक्रमित किया जा सकता है, लेकिन यह तुच्छ नहीं है, मैं मानता हूं - EXTRACT()अधिक कॉम्पिटिबल लगता है।
pozs

1
आप अंतराल का उपयोग करके अपने आवेदन में तारीख की गणना से बच सकते हैं। उदाहरण: WHERE login_date> = '2014-02-01' और login_date <'2014-02-01' :: दिनांक + INTERVAL '1 महीना' यह अभी भी आपके कोड को सरल करते हुए अनुक्रमित का उपयोग करता है।
बेसवेल


23

बस किसी के यहाँ जमीन में ... 8.1 के बाद से आप बस उपयोग कर सकते हैं:

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

डॉक्स से:

BETWEEN SYMMETRIC, BETWEEN की तरह ही है, इसके अलावा कोई आवश्यकता नहीं है कि दायीं ओर के तर्क की बायीं तरफ या उससे कम या उसके बराबर तर्क हो। यदि ऐसा नहीं है, तो उन दो तर्कों को स्वचालित रूप से स्वैप किया जाता है, ताकि एक गैर-रिक्त सीमा हमेशा निहित हो।


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

एक तारीख के लिए असाधारण रूप से कीवर्ड काम करता है। यह मानता है कि तारीखों के लिए समय 00:00:00 (मध्यरात्रि) का है।


-14

प्रलेखन पढ़ें।

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

मैंने उस तरह एक क्वेरी का उपयोग किया:

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')    

जुआनिटोस इनजेनियर।


2
यह बिल्कुल सवाल का जवाब नहीं है। सवाल महीने और साल के आधार पर तारीखों के लिए पूछता है।
राम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.