MySQL中用于AngularJS日期过滤器过滤的日期格式

Date formatting in MySQL for filtering by AngularJS date filter

本文关键字:日期 过滤 格式 过滤器 MySQL 用于 AngularJS      更新时间:2023-09-26

我正在使用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="文档中的文档"中

<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语句?如果没有,我需要做什么才能让这类人工作?

通过阅读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>