2015-10-31 105 views
2

在數據庫中,我有列date_of_premiere(類型:INT)。順便指出,列可以存儲三個值中的「類型」的驗證:排序多個日期格式

YYYY(如2016年,當有關於具體的月份和日子沒有資料)

YYYYMM(如201511,當有關於特定一天沒有資料)

年月日(如20151101)

我有問題排序,becouse當我試圖解決該列...

$query = $this->db->query(" SELECT * from table order by `date_of_premiere "); 

...格式爲YYYY的記錄將始終在第一位。

當我獲取數據,我可以做一些變通辦法的......

$dates =[]; 
while($row = $query->fetch_assoc()) 
{ 
    if(strlen($row['date_of_premiere']) == 4) 
    { 
     $dates[] .= intval($row['date_of_premiere'] .'0000'); 
    } else if (strlen($row['date_of_premiere']) == 6) 
    { 
     $dates[] .= intval($row['date_of_premiere'] .'00'); 
    } else 
    { 
     $dates[] .= intval($row['date_of_premiere']); 
    } 
} 

...然後我可以做asort($dates) ...

// input values: 2015, 2016, 201511, 20151101 
// example output with correct sorting: 
Array 
(
    [1] => 20150000 
    [0] => 20151100 
    [3] => 20151101 
    [2] => 20160000 
) 

...但我好奇的是有辦法使用mysqli查詢只排序date_of_premiere

+2

我想這將是一個有點複雜來實現。我發現[這裏](http://stackoverflow.com/questions/28640428/find-actual-data-type-in​​-mysqli)MySQLi中有datetime列類型。也許用它代替INT會是個好主意?我知道你並不總是知道完整的日期,但你可以添加一些布爾值來指示缺失的信息,並且排序將默認工作:) –

+1

我想,我發現很簡單的解決方案。我改變了mysql列的類型爲varchar.It似乎現在我可以按照預期排序值:array([1] => 2015 [0] => 201511 [3] => 20151101 [2] => 2016)無論如何,感謝您的幫助:) –

回答

1

您可以通過日期一欄中鑄成CHAR訂購:

... ORDER BY CAST(date_of_premier AS CHAR(32)) 
+0

無論如何,如果您不需要MySQL使用它的值進行任何算術運算,我會將列更改爲VARCHAR。 –