代码之家  ›  专栏  ›  技术社区  ›  Jakub

几乎相同值的日期比较

  •  0
  • Jakub  · 技术社区  · 8 年前

    我有一张有两列的桌子 创造在 和 有效的 是的。 在我数据库中的大多数情况下,它们应该是相同的。

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

    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 $1  [["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的角度来看,这是一样的。对于数据库-不是。

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

    2 回复  |  直到 8 年前
        1
  •  2
  •   noctifer    8 年前

    看看博士后的这个奇妙功能 date_trunc() 是的。:)

    所以基本上比较

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

    就你而言,我想,四舍五入到“秒”就可以了。

    希望有帮助!

        2
  •  0
  •   Praveen S    8 年前

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

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

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