【问题标题】:Calculate difference between two dates with timestamps in Laravel在 Laravel 中计算两个带有时间戳的日期之间的差异
【发布时间】:2019-11-20 14:58:47
【问题描述】:

我的表中有一个带有 created_at 和 updated_at 的时间戳

$table->timestamps();

但我想添加另一列来计算 created_at 和 updated_at 之间的差异(以天为单位)

我应该在 SQL 中还是在我的控制器中执行此操作?

【问题讨论】:

  • 你用过碳外墙吗??
  • @AmitSenjaliya 不,我没有使用
  • 你可以试试下面的答案代码吗?
  • @OthmanBūlal 应该是什么输出,是分钟、小时还是天等?
  • @gecko 以小时为单位,如果超过 24 小时,则以天为单位

标签: sql laravel date timestamp


【解决方案1】:

您可以在 Eloquent 模型中执行此操作。 假设您的模型名称为User。 您可以通过定义 Accessor 来创建计算域。

class User extends Model 
{
  $dates = [
    'updated_at',
    'created_at'
  ];
  $appends = ['diffInDays'];

  public function getDiffInDaysAttribute()
  {
    if (!empty($this->created_at) && !empty($this->updated_at)) {
      return $this->updated_at->diffInDays($this->created_at);
    }
  }
}

一些解释

通过将 created_atupdated_at 添加到 $dates 数组中,Laravel 会自动将您的日期值转换为 Carbon。 现在,如果您执行$user->created_at 之类的操作,您将不会得到字符串,而是该日期的 Carbon 实例。这使您可以进行一些不错的日期计算,例如上面的。

通过使用getDiffInDaysAttribute 函数添加访问器,您可以像普通属性一样通过$user->diffInDays 调用天差,尽管它不在模型上。

但如果您现在执行$user->toArray() 之类的操作,diffInDays 属性将不可用。 要在检索用户数据时始终添加天数差异,您可以将该字段添加到 $appends 数组。 这样,当您通过 Eloquent 检索用户数据时,该字段将始终返回。

【讨论】:

  • 它有效,它计算了差异,但我认为它计算不正确,因为例如,11 月 1 日和 11 月 21 日之间的差异是 20 天,但我的表显示 18
【解决方案2】:

要让它在每次更新该模型时自动保存此值,然后您可以将其放入模型中。

public static function boot() 
{
    parent::boot();

    static::updating(function($model) {
        $diffInDays = $model->updated_at->diffInDays($model->created_at);
        $model->timestamp_difference = $diffInDays;
    });
}

timestamp_difference 是我使用的 DB 列的名称,可以是任何你想要的名称。

【讨论】:

    【解决方案3】:

    使用Carbon 计算日期差异(以天为单位)。

       $to = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $created_at);
       $from = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $updated_at);
       $diff_in_days = $to->diffInDays($from);
    

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2011-08-01
      • 2020-05-13
      • 2012-06-10
      • 1970-01-01
      相关资源
      最近更新 更多