几乎相同值的日期比较

Date comparison of nearly the same values

我有一个 table,其中包含两列 created_atvalid_from。 在我的数据库中,它们在大多数情况下应该是相同的。

当我想要获得所有列都相等的记录时,我得到了零条记录。

Order.where('created_at == valid_from').length

Order Load (3609.4ms)  SELECT "orders".* FROM "orders" WHERE (created_at <> valid_from)
=> 0 

所以我采取了另一种方法:

ord = Order.where("created_at != valid_from").first
  Order Load (741.0ms)  SELECT  "orders".* FROM "orders" WHERE (created_at != valid_from) ORDER BY "orders"."id" ASC LIMIT   [["LIMIT", 1]]
ord.created_at == ord.valid_from
  => false 
ord.created_at                  
  => Wed, 04 Jul 2018 11:34:44 CEST +02:00 
ord.valid_from
  => Wed, 04 Jul 2018 11:34:44 CEST +02:00 
ord.valid_from.to_i 
  => 1530696884 
ord.created_at.to_i
  => 1530696884 
ord.valid_from.to_i == ord.created_at.to_i
  => true 
ord.valid_from == ord.created_at     
  => false 
ord.created_at.to_f
  => 1530696884.26669 
ord.valid_from.to_f
  => 1530696884.2668211 

所以两个日期之间存在微小的差异。从Rails的角度来看,也是一样的。对于数据库 - 不是。

处理具有微小差异的日期的最佳方法是什么?

看看Postgres的这个精彩功能date_trunc()。 :)

所以基本上比较看起来像

WHERE (date_trunc('second', created_at) != date_trunc('second', valid_from))

在你的情况下,我认为四舍五入到 "second" 就可以了。

希望对您有所帮助!

如果你不想考虑时间而只考虑日期,试试“::date”

例如:SELECT 'Wed, 04 Jul 2018 11:34:44'::date

SELECT "orders".* FROM "orders" WHERE created_at:date = valid_from:date