Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Railsy `gdzie` na czas krótszy niż zapytania

Edytuj 2 5/9/20

Jeśli używasz Rubiego 2.6, możesz to zrobić z nieskończonymi zakresami, aw Ruby 2.7 możesz używać zakresów bez początku.

Np.:

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

generuje

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

i

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

generuje

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

Edytuj

Jest to teraz możliwe w Rails 5!

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

wygeneruje SQL

SELECT `users`.* FROM `users` WHERE (`users`.`last_deposit` >= '2018-06-30 17:08:54.130085').

Oryginalna (i Rails <5) odpowiedź

Nie wygląda na to, że istnieje sposób na użycie podstawowego where składnia skrótu do generowania zapytania o wartości większe lub mniejsze niż dla znaczników czasu. Najprostszy i najbardziej czytelny sposób jest opisany w moim pytaniu w sekcji Current Simple Solution .

Innym sposobem na to jest użycie ARel, ale musisz wykonać kilka rzadziej spotykanych połączeń. Najpierw możesz uzyskać uchwyt do tabeli ARel klasy AR, uzyskać dostęp do kolumny, przekazać wynik większej niż gt , większe lub równe gteq , mniej niż lt i/lub mniejsze lub równe lteq metoda z argumentem do where .

W powyższej sytuacji byłoby to zrobione tak:

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. LEWE DOŁĄCZ tylko w pierwszym rzędzie

  2. MySQL Cast jako Boolean

  3. Jak mogę wysyłać zapytania między dwiema datami za pomocą MySQL?

  4. Najlepszy typ danych do przechowywania wartości pieniężnych w MySQL

  5. Jak rozwiązać Ogólny błąd:serwer MySQL 2006 zniknął