2012-05-28 44 views
7

Tôi có ứng dụng đường ray có kiểu Checkin. Tôi muốn tìm tất cả hồ sơ nằm trong phạm vi thời gian cụ thể cho ngày hiện tại. Làm cách nào để viết một số where để nhận tất cả hồ sơ được tạo từ 12 giờ trưa đến 4:30 chiều?Truy vấn đường ray giữa hai lần

+0

Bạn đang sử dụng cơ sở dữ liệu nào? các chức năng để có được giờ trong ngày sẽ khác nhau. Sẽ dễ nhất nếu bạn lưu trữ giờ/phút trong ngày ngoài thời gian. –

+0

Tôi đang sử dụng postgresql. Tôi đang sử dụng cột dấu thời gian 'created_at' chuẩn mà Rails cung cấp –

Trả lời

36

Câu trả lời của @ x1a4 phải phù hợp với bạn nhưng bạn có thể thực hiện theo cách dễ đọc hơn và ngắn hơn, sử dụng dải ô.

Chekin.where(created_at: Time.parse("12pm")..Time.parse("4:30pm")) 

Nó sẽ tạo ra một cái gì đó như:

SELECT "checkins".* 
FROM "checkins" 
WHERE ("checkins"."created_at" BETWEEN '2012-05-28 12:00:00.000000' AND '2012-05-28 16:30:00.000000') 

Bạn có thể thay đổi Time.parse("12pm") với bất kỳ cách nào khác để tạo ra một thời điểm.

8

này có vẻ như nó sẽ làm việc, giả sử múi giờ UTC:

Record.where('created_at > ? AND created_at < ?', Date.today + 12.hours, Date.today + 16.5.hours) 

hoặc với một BETWEEN:

Record.where('created_at BETWEEN ? AND ?', Date.today + 12.hours, Date.today + 16.5.hours) 

BETWEEN có thể hoặc không có thể bao gồm các giá trị thứ hai trong phạm vi. Postgres includes it.

0

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

này gem khá dễ sử dụng và rõ ràng hơn [By sao] [1]. Tôi đang 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õ ràng.

Post.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 Post.by_month("January", field: :updated_at)

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

Các vấn đề liên quan