2014-10-27 70 views
3

我感到困惑像GridView的created_atupdated_at過濾領域。 Yii2建議使用unix時間戳保存到MySQL數據庫的整數字段中。這一切都很好,但我如何過濾這些值?如果我只想過濾日期 - 是否必須將以下內容添加到搜索方法中?Yii2 - GridView控件過濾unix時間戳

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

或者使用FROM_UNIXTIME以特定格式?當然可以這樣做,但比較字段意味着將所有值轉換爲日期,然後進行比較。

我做錯了嗎?

+0

'$ this-> created_at'的類型是什麼?這也是一個unix時間戳? – Barry 2014-10-27 17:50:45

+0

PHP把它看作一個整數,在數據庫中它也是一個簡單的整數,所以我可以保存unix時間戳。 – Joe 2014-10-28 09:50:49

回答

4

你是不是做錯了,但如果你想上的時間戳篩選你至少有兩個選項。

  1. 轉換查詢中的時間戳。
  2. 轉換要過濾的值。

您可以將所有值轉換爲日期並比較它,這是第一個選項(MySql將每個時間戳轉換爲日期)所做的評論。 (但是,您是否還必須將$this->created_at轉換爲日期?)。

選擇第二個選項,你$this->created_at值轉換爲最低和最高的Unix時間戳值和使用之間通訊選擇篩選子句。在這種情況下,您只需要通過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]); 
+0

謝謝。這真的很有幫助。我使用你的代碼做了一個特徵,並在我的查詢中使用它。 – Joe 2014-10-28 14:08:27