2012-09-13 11 views
16

मेरे पास डेटाबेस में दो दिनांक कॉलम हैं - from_date और to_dateरेल सक्रियकॉर्ड - दो तिथियों के बीच रिकॉर्ड कैसे प्राप्त करें

उदाहरण:

  • from_date: 2012-09-10
  • to_date: 2012-09-30
  • today: 2012-09-13

मुझे सभी आरईसी लाने की आवश्यकता होगी ords, अगर today की तारीख from_date और to_date के बीच है। एसक्यूएल क्वेरी में ऐसा कैसे करें?

मैं संबंधित रिकार्ड लोड किया है, तो मैं आसानी से तय कर सकते हैं, अगर आज की तारीख from_date और to_date के बीच है, लेकिन मैं नहीं जानता, कैसे डेटाबेस से सीधे उन रिकॉर्ड लाने के लिए।

+1

मुझे लगता है कि इस सवाल का सहायक हो सकता है: [रेल के बीच ActiveRecord तारीख] (http://stackoverflow.com/a/2381825/722783) –

उत्तर

18
data = ModelName.where("today >= from_date AND today <= to_date") 
+5

यह उत्तर वास्तव में पाउलो की तुलना में अधिक सामान्य है। पाउलो की क्वेरी मानती है कि आपके पास एक फ़ील्ड है ('answer_at' उसका जवाब) जिसमें आप दो तिथियों के बीच होने की उम्मीद करते हैं। अगर मैं देखना चाहता हूं कि आज 'start_date' और' end_date' के बीच है या नहीं? पाउलो के जवाब के साथ ऐसा नहीं कर सकता। – Sebastialonso

4
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date") 
42

चेक Rails guides रेंज शर्तों पर:

Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight) 

कि निम्नलिखित एसक्यूएल का उत्पादन करेगा:

SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00') 
+15

यह वास्तव में पूछे जाने वाले प्रश्न का उत्तर नहीं देता है। वह जानना चाहता है कि दिनांक दो अलग-अलग कॉलम के मूल्य के बीच कब होता है, यह वह जगह है जहां एक कॉलम दो तिथियों के बीच होता है। –

1

आप मणि नीचे इस्तेमाल कर सकते हैं तिथियों के बीच रिकॉर्ड को खोजने के लिए,

यह जीई उपयोग करने में काफी आसान है और By star इस मणि और एपीआई का उपयोग करके अधिक स्पष्ट और दस्तावेज़ीकरण भी स्पष्ट रूप से समझाया गया है।

ModelName.between_times(Time.zone.now - 3.hours, # all posts in last 3 hours 
        Time.zone.now) 

यहाँ आप हमारे क्षेत्र गुजारें सकता भी ModelName.by_month("January", field: :updated_at)

कृपया दस्तावेज़ देखें और यह प्रयास करें।

2

यह चाल करना चाहिए।

today = Date.today 

data = ModelName.where("from_date <= ? AND to_date >= ?", today, today) 
6

आप इस तरह उपयोग कर सकते हैं:

Data = Model.where("date(now()) between from_date and to_date") 
1

ठीक है, के बाद गूगल में एक लंबी खोज के एक दो दिनांक फ़ील्ड और एक चर, सबसे अनुमानित साथ जो करने के लिए "जिस तरह से रेल" की तलाश में समाधान मैंने पाया है कि ऐसा करने के लिए अपना खुद का scope बना रहा है।

अपने ApplicationRecord लिखने में

:

class ApplicationRecord < ActiveRecord::Base 

    scope :between_fields, -> (value, initial_date, final_date) { 
    where "('#{value}' BETWEEN #{initial_date} AND #{final_date})" 
    } 

end 

तो अब, जहाँ भी आप करने की ज़रूरत है कि आप जो कर सकते हैं:

@clients = Client.between_fields(params[:date], :start_date, :final_date) 
# SELECT * FROM clients WHERE ('2017-02-16 00:00:00' BETWEEN start_date AND final_date) 

आप इसे दूसरों "कहाँ" आपकी क्वेरी करने के लिए के साथ गठजोड़ कर सकते हैं जैसा कि आपको चाहिए उतना विशिष्ट।

+1

ऐसा करने का एक अच्छा तरीका है, लेकिन स्ट्रिंग इंटरपोलेशन का उपयोग सुरक्षा के लिए एक बुरा विचार है। आपको प्रश्नों के अंदर '# {string}' वाक्यविन्यास का उपयोग नहीं करना चाहिए, खासकर जब आप सीधे पैरा से गुजर रहे हैं! –

1

करने के लिए एक सुरक्षित और आसान तरीका यह होगा:

Model.where(':date BETWEEN from_date AND to_date', date: Date.today) 
संबंधित मुद्दे