2012-09-13 43 views
16

Tôi có trong cơ sở dữ liệu hai cột ngày - from_dateto_date.Rails ActiveRecord - cách tìm nạp bản ghi giữa hai ngày

Ví dụ:

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

Tôi sẽ cần tìm nạp lại tất cả ords, nếu ngày của today là giữa from_dateto_date. Làm thế nào để làm điều đó trong truy vấn SQL?

Nếu tôi đã tải bản ghi tương ứng, tôi có thể dễ dàng quyết định, nếu ngày hôm nay là giữa from_dateto_date, nhưng tôi không biết, cách tìm nạp thẳng những bản ghi đó từ cơ sở dữ liệu.

+1

Tôi nghĩ rằng câu hỏi này có thể hữu ích: [Rails ngày ActiveRecord giữa] (http://stackoverflow.com/a/2381825/722783) –

Trả lời

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

Câu trả lời này thực sự tổng quát hơn của Paulo. Truy vấn của Paulo giả sử bạn có một trường ('created_at'in câu trả lời của mình) mà bạn mong đợi có ở giữa hai ngày. Điều gì sẽ xảy ra nếu tôi muốn xem ngày hôm nay có nằm trong khoảng từ 'ngày bắt đầu' và 'end_date' không? Không thể làm điều đó với câu trả lời của Paulo. – Sebastialonso

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

Kiểm tra Rails guides về điều kiện Phạm vi:

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

Điều đó sẽ tạo ra SQL sau:

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

Điều này không thực sự trả lời câu hỏi được hỏi. Anh ta muốn biết khi nào một ngày nằm giữa giá trị của hai cột riêng biệt, đây là nơi một cột nằm giữa hai ngày. –

1

Bạn có thể sử dụng dưới đây đá quý để tìm các hồ sơ giữa ngày,

Địa chỉ này m khá dễ sử dụng và rõ ràng hơn By star am sử dụng đá quý này và API rõ ràng hơn và tài liệu cũng được giải thích rõ.

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

Ở đây bạn có thể vượt qua lĩnh vực của chúng tôi cũng ModelName.by_month("January", field: :updated_at)

hãy xem tài liệu và thử nó.

2

Điều này cần thực hiện thủ thuật.

today = Date.today 

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

bạn có thể sử dụng như thế này:

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

Ok, sau khi tìm kiếm dài trong google tìm kiếm một "đường ray cách" để làm một GIỮA với hai trường ngày và một biến, gần đúng nhất giải pháp tôi tìm thấy là tạo ra scope của riêng bạn để làm điều đó.

trong ApplicationRecord ghi của bạn:

class ApplicationRecord < ActiveRecord::Base 

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

end 

Vì vậy, bây giờ, bất cứ nơi nào bạn cần phải làm một giữa bạn có thể làm:

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

Bạn có thể kết hợp nó với những người khác "ở đâu" để làm truy vấn của bạn cụ thể như bạn cần.

+1

Phạm vi là một cách hay để thực hiện việc này, nhưng việc sử dụng nội suy chuỗi là một ý tưởng tồi để bảo mật. Bạn không nên sử dụng cú pháp '# {string}' bên trong các truy vấn, đặc biệt là khi bạn đang chuyển thẳng từ các tham số! –

1

Một cách an toàn và dễ dàng để làm được điều này sẽ là:

Model.where(':date BETWEEN from_date AND to_date', date: Date.today) 
Các vấn đề liên quan