【问题标题】:Calculating difference between created_at and now() in rails update在 rails update 中计算 created_at 和 now() 之间的差异
【发布时间】:2015-12-09 22:17:32
【问题描述】:

我有一列应该以分钟为单位包含 created_at 和 updated_at 之间的差异,所以我尝试执行以下操作,但它通常将 time_diff 保存为零。那么,我该如何解决呢?

Product.update(
    id,
    time_diff: "((EXTRACT (DAY FROM (now()-created_at))*24*60*60+
                    EXTRACT (HOUR FROM (now()-created_at))*60*60+
                    EXTRACT (MINUTE FROM (now()-created_at))*60+
                    EXTRACT (SECOND FROM (now()-created_at)))/60)::int"
  )

Extract 查询在 SQL 中工作正常,但在 activerecord 的更新中不起作用。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord


    【解决方案1】:

    时差的方法很多。您可以自定义时差方法,例如:

    def time_diff(start_time, end_time)
      seconds_diff = (start_time - end_time).to_i.abs
    
      hours = seconds_diff / 3600
      seconds_diff -= hours * 3600
    
      minutes = seconds_diff / 60
      seconds_diff -= minutes * 60
    
      seconds = seconds_diff
    
      "#{hours.to_s.rjust(2, '0')}:#{minutes.to_s.rjust(2, '0')}:#{seconds.to_s.rjust(2, '0')}"
    end
    

    并使用它

    time_diff(updated_at, created_at) #just example
    

    或者你可以使用 ruby​​ gem time_difference

    【讨论】:

    • 我想在使用activerecord .update时一步完成......不想获取数据并计算差异然后保存日期
    • @MahmoudM.Abdel-Fattah 写一个回调 after_save :update_time_diff # product.rb def update_time_diff update_attributes(time_diff: (update_at - created_at)/60 ) end 希望它对你有用。
    【解决方案2】:

    extract (epoch ...) 给出了一个以秒为单位的间隔,所以使用:

    select extract (
        epoch from now() - '2015-09-14 03:06:02.848+02'::timestamp)::int/60 
        as minutes;
    
     minutes
    ---------
           7
    (1 row)
    

    【讨论】:

    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多