Yii2 - gridview过滤器unix时间戳

时间:2014-10-27 12:48:57

标签: php mysql unix-timestamp yii2

我对在GridView中过滤created_atupdated_at等字段感到困惑。 Yii2建议在MySQL数据库中使用保存到整数字段的unix时间戳。一切都很好,但我怎样才能过滤这些值?如果我只想过滤日期 - 我是否必须像搜索方法一样添加以下内容?

$query->andFilterWhere([
'DATE(FROM_UNIXTIME('.$this->tableName() . '.created_at))' => $this->created_at]);

或者使用具有特定格式的FROM_UNIXTIME?当然可以这样做,但比较字段意味着将所有值转换为日期然后进行比较。

我做错了吗?

1 个答案:

答案 0 :(得分:4)

你没有做错,但如果你想过滤时间戳,你至少有两个选择。

  1. 转换查询中的时间戳。
  2. 转换您要过滤的值。
  3. 您可以将所有值转换为日期并进行比较,这是第一个选项(MySql将每个时间戳转换为日期)。 (但是你不必将$this->created_at转换为日期吗?)。

    使用第二个选项,将$this->created_at值转换为最低和最高的unix时间戳值,并使用SELECT BETWEEN过滤器子句。在这种情况下,您只需要两次由Php完成的转换(转换为最低和最高日期值),而MySql只执行范围检查。

    // date to search        
    $date = DateTime::createFromFormat('m/d/Y', '10/27/2014');
    $date->setTime(0,0,0);
    
    // set lowest date value
    $unixDateStart = $date->getTimeStamp();
    
    // add 1 day and subtract 1 second
    $date->add(new DateInterval('P1D'));
    $date->sub(new DateInterval('PT1S'));
    
    // set highest date value
    $unixDateEnd = $date->getTimeStamp();
    
    $query->andFilterWhere(
        ['between', 'created_at', $unixDateStart, $unixDateEnd]);