几乎相同值的日期比较
Date comparison of nearly the same values
我有一个 table,其中包含两列 created_at 和 valid_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
我有一个 table,其中包含两列 created_at 和 valid_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