sql >> Database teknologi >  >> RDS >> Mysql

Skinner 'hvor' for mindre tid end forespørgsler

Rediger 2 5/9/20

Hvis du bruger Ruby 2.6, kan du gøre dette med uendelige intervaller, og i Ruby 2.7 kan du bruge intervaller uden begyndelse.

F.eks.:

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

genererer

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

og

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

genererer

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

Rediger

Dette er nu muligt i Rails 5!

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

vil generere SQL

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

Original (og skinner <5) svar

Det ser ikke ud som om der er en måde at bruge grundlæggende where på hash-syntaks for at generere en større end eller mindre end forespørgsel for tidsstempler. Den enkleste og mest læsbare måde er beskrevet i mit spørgsmål under Current Simple Solution .

En anden måde at gøre det på gør brug af ARel, men du skal foretage nogle mindre almindeligt sete opkald. Først kan du få styr på AR-klassens ARel-tabel, få adgang til kolonnen, sende resultatet af større end gt , større end eller lig med gteq , mindre end lt , og/eller mindre end eller lig med lteq metode med et argument til where .

I situationen ovenfor ville dette blive gjort som:

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. Billigste måde at afgøre, om en MySQL-forbindelse stadig er i live

  2. Udfylder dropdown - PHP Ajax MySQL

  3. MySQL/InnoDB og langvarige forespørgsler

  4. Udfør en dynamisk krydstabuleringsforespørgsel