我使用MySQL,AngularJS和ngTable来构建表格数据,并且我在排序方面遇到了问题。
数据库
`id` int(11) NOT NULL AUTO_INCREMENT,
`packageid` int(11) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, // 2014-10-30 15:31:56
`status` int(11) NOT NULL DEFAULT '1',
SQL
$query = $this->db->query(
"SELECT packageinstance.id,
packageinstance.created // 2014-10-30 15:31:56
DATE_FORMAT(packageinstance.created, '%b %e, %Y') as date, // Jan 1, 2014
user.username,
status.name as status
FROM packageinstance
JOIN user ON user.id = packageinstance.creatorid
JOIN status ON status.id = packageinstance.status
WHERE packageinstance.locationid = ?
ORDER BY packageinstance.created DESC", array( $locationId ) );
AngularJS在ng-repeat =" doc in documents"
<td data-title="'Date'"
sortable="'created'"
ng-bind="(doc.created|date:mediumDate)"></td> // attempt one
<td data-title="'Date'"
sortable="'date'"
ng-bind="(doc.date|date:mediumDate)"></td> // attempt two
使用这些格式中的任何一种,排序都不起作用,因为它根据字符串进行排序。无论如何将日期转换为Angular可以过滤的东西,但是根据日期值排序,只需要更改SQL语句?如果不是我需要做什么才能让排序工作?
答案 0 :(得分:0)
通过MySQL文档阅读我发现了另一个日期函数UNIX_TIMESTAMP,我用它来替换查询中的DATE_FORMAT。
$query = $this->db->query(
"SELECT packageinstance.id,
UNIX_TIMESTAMP(packageinstance.created) as epoch_time, // replaced DATE_FORMAT
user.username,
status.name as status
FROM packageinstance
JOIN user ON user.id = packageinstance.creatorid
JOIN status ON status.id = packageinstance.status
WHERE packageinstance.locationid = ?
ORDER BY packageinstance.created DESC", array( $locationId ) );
这允许Angular的日期过滤器完成它的工作,但显示所有日期的1970年1月17日。还有一点工作,我记得时间戳是自1970年1月17日(纪元时间)以来的秒数,需要乘以1000才能到达过滤前的正确日期,所以我将其添加到Angular标记中,它现在可以正确过滤用户,并使用基础时间戳正确排序。
<td data-title="'Date'"
sortable="'epoch_time'"
ng-bind="(doc.epoch_time*1000|date:mediumDate)"></td>