Estoy tratando de devolver los registros de anteayer. Mis registros tienen fecha creada_en la columna con fecha y hora. Mientras que mi condición tiene solo la fecha, por lo que siempre no devuelve registros.

Lo tuve trabajando en dev on en sqlite usando strftime para eliminar el tiempo, pero ¿cómo lo hago por favor en PG in live?

@articles = Article.where("created_at = ?", Date.yesterday-(params[:increment].to_i)).reverse

(incremento = el número de días antes de ayer).

Muchas gracias

1
Simonp27 25 jun. 2017 a las 20:50

3 respuestas

La mejor respuesta

Varias formas. Si bien prefiero un rango de fechas como:

.where("created_at > ? AND created_at < ?", date_from, date_to)

También puede usar la función incorporada de PostgreSQL date_trunc

.where("date_trunc('day', created_at) = ?", date)

Pero tenga en cuenta que también necesita postgres en su máquina de desarrollo local.

Documentos: https://www.postgresql.org/docs/9.1/ static / functions-datetime.html

2
everyman 25 jun. 2017 a las 18:06

Decir hoy es

> DateTime.now
 => Mon, 26 Jun 2017 00:17:12 +0545

> Account.where('created_at between ? and ?', 2.days.ago.beginning_of_day, 2.days.ago.end_of_day)
  Account Load (0.5ms)  SELECT  "accounts".* FROM "accounts" WHERE (created_at between '2017-06-23 00:00:00' and '2017-06-23 23:59:59.999999') LIMIT ?  [["LIMIT", 11]]


 => #<ActiveRecord::Relation [#<Asset id: 3, name: "created 4 days ago", code: nil, type: "Asset", created_at: "2017-06-17 06:57:13", updated_at: "2017-06-21 06:57:13">]> 
  • De esta forma, encontrará artículos creados desde el inicio de Jun 25 00:00:00 hasta Jun 26 00:00:00.

Consulte sobre begin_of_day y end_of_day

1
illusionist 25 jun. 2017 a las 18:46

En las versiones actuales de Rails (desde la versión 5.1) puede usar all_day ayudante para consultas como esta:

date = (params[:increment].to_i + 1).days.ago
Article.where(created_at: date.all_day).reverse
3
spickermann 26 jun. 2017 a las 06:20