2015-10-31 57 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。 –