【问题标题】:Date formatting in MySQL for filtering by AngularJS date filterMySQL 中的日期格式,用于通过 AngularJS 日期过滤器进行过滤
【发布时间】:2015-01-01 05:20:12
【问题描述】:

我正在使用 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 ) );

ng-repeat="文档中的文档"中的AngularJS

<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语句?如果不是,我需要做什么才能让排序工作?

【问题讨论】:

    标签: javascript mysql angularjs sorting


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      相关资源
      最近更新 更多