Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Rails `where` với thời gian ít hơn các truy vấn

Chỉnh sửa 2 5/9/20

Nếu bạn đang sử dụng Ruby 2.6, bạn có thể thực hiện việc này với phạm vi vô tận và trong Ruby 2.7, bạn có thể sử dụng phạm vi bắt đầu ít hơn.

Ví dụ:

# Ruby >= 2.6
User.where(last_deposit: 10.days.ago..)

tạo ra

SELECT "users".* FROM "users" WHERE "user"."last_deposit" >= '2020-04-29 21:58:39.109419'"

# Ruby >= 2.7
User.where(last_deposit: ..10.days.ago)

tạo ra

SELECT "users".* FROM "users" WHERE "users"."last_deposit" <= '2020-04-29 22:01:05.582055'

Chỉnh sửa

Điều này hiện có thể thực hiện được trong Rails 5!

User.where(last_deposit: 10.days.ago..DateTime::Infinity.new)

sẽ tạo ra SQL

SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2018-06-30 17:08:54.130085').
Câu trả lời

Original (và Rails <5)

Có vẻ như không có cách nào để sử dụng where cú pháp băm để tạo truy vấn lớn hơn hoặc nhỏ hơn cho dấu thời gian. Cách đơn giản và dễ đọc nhất được nêu trong câu hỏi của tôi dưới Current Simple Solution .

Một cách khác để thực hiện là sử dụng ARel nhưng bạn phải thực hiện một số cuộc gọi ít thường thấy hơn. Trước tiên, bạn có thể nhận một xử lý tới bảng ARel của lớp AR, truy cập cột, chuyển kết quả lớn hơn gt , lớn hơn hoặc bằng gteq , nhỏ hơn lt và / hoặc nhỏ hơn hoặc bằng lteq phương thức có đối số là where .

Trong tình huống trên, điều này sẽ được thực hiện như sau:

last_deposit_column = User.arel_table[:last_deposit]
last_deposit_over_ten_days_ago = last_deposit_column.gteq(10.days.ago)
User.where(last_deposit_over_ten_days_ago)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách chọn số lượng từ truy vấn chính thành truy vấn phụ

  2. Bất kỳ hướng dẫn cơ sở dữ liệu quan hệ tốt nào?

  3. điều kiện cuộc đua chèn mysql

  4. Cách sao lưu các thủ tục được lưu trữ trong MySQL

  5. Cách chọn từ MySQL trong đó Tên bảng là Biến