查询相对格式日期

gjmwrych  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(385)

我有两张table:台阶和流水。
步骤有很多流程。
步骤有 relative_time (字符串)列。
流量有 active_on (可为空,时间戳)列。
步骤 relative_time 存储相关格式,其值如下:“+1年”、“+2天”、“+30天”等。
流量 active_on 当用户激活流时设置,它看起来像:“2017-12-30 00:00:00”。
每次我想知道流何时过期,我都会从数据库中选择它,然后在php(laravel,carbon)中执行:

/**
 * @return null|Carbon
 */
public function getExpiresAtAttribute() 
{
    if (!$this->active_on) {
        return null;
    }

    // Access the relative time for step (for example: "+3 days").
    $relativeTime = $this->step->relative_time;

    // Adds the limit time to the activation date,
    // turning it possible to check when the current flow
    // will "expires". 
    return $this->active_on->modify($relativeTime);        
}

问题
在php中很容易检查expires at value。问题是,现在我只需要直接从数据库中选择“过期”的流,我不知道使用这种方法是否可行。我怎样才能做到这一点?

1sbrub3j

1sbrub3j1#

您可以在相对时间中存储天数,而不是php日期间隔。这样您可以查询:

SELECT * FROM flows, steps WHERE flows.step_id = step.id AND NOW() > ADDDATE(flows.active_on, steps.relative_time)

这样,所有的流都会过期。
实际上不需要改变数据库结构。您可以创建一个迁移来将相对时间从dateinterval转换为天数(是一个字符串字段)。

foreach (Steps::all() as $step) {
    $step->update([
      'relative_time' => strtotime($step->relative_time,0)/(3600*24);
    ]);
}

然后可以调整getExpireStatAttribute:

/**
 * @return null|Carbon
 */
public function getExpiresAtAttribute() 
{
    if (!$this->active_on) {
        return null;
    }

    // Access the relative time for step (for example: "+3 days").
    $relativeTime = $this->step->relative_time;

    // Adds the limit time to the activation date,
    // turning it possible to check when the current flow
    // will "expires". 
    return $this->active_on->modify("+$relativeTime days");        
}

相关问题