【问题标题】:Complex Table Sorting复杂表排序
【发布时间】:2014-10-30 19:26:51
【问题描述】:

我们在单个数据库中跟踪项目进度。在过去的两年里,管理层的要求改变了我们存储日期的格式(最初是年,然后是年月,现在是完整的日期)。为了确保没有来自数据库的投诉,之前的管理员设置了表格以将日期存储在varchar 而不是date。我创建了一个 Web 界面供用户访问和生成报告,但网页是静态的(用户端)。管理层希望能够通过单击表头进行排序。这很简单。我的问题是那些日期!由于格式的原因,它们无法正确排序。

以下是 PHP 中日期可以显示的三种形式:%Y、%Y%m 和 %c/%e/%Y。

我正在使用tablesorter 对表格进行排序,但我不知道如何通过 jQuery 对日期进行排序。初始排序完全在 MySQL 查询中完成:

ORDER BY
 CASE WHEN cstatus = 'Complete' THEN 1 ELSE 0 END DESC,
 CASE WHEN CHAR_LENGTH(cdevelopmentStart) > 6 THEN
  DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%m/%d/%Y'), '%c/%e/%2014')
 ELSE
  CASE WHEN CHAR_LENGTH(cdevelopmentStart) > 4 THEN
   DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%Y%m'), '%c/%e/%Y')
  ELSE
   DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%Y'), '%c/%e/%Y')
  END
 END DESC,
 id DESC

我需要在 jQuery 排序中复制日期列的排序。

希望,经过一晚的休息后,我会有更多的运气,但我想把这个贴出来,以防有人可以给我一个先机。 ^^

解决方案:

按照 Mottie 的建议,我将查询修改为,而不是最初按条件排序,而是将其保留为默认排序并创建其他列来填充 data-text 属性。

SELECT
 CASE WHEN cdevelopmentStart IS NULL THEN
  '01/01/2012'
 ELSE
  CASE WHEN CHAR_LENGTH(cdevelopmentStart) > 6 THEN
   DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%m/%d/%Y'), '%m/%d/%Y')
  ELSE
   CASE WHEN CHAR_LENGTH(cdevelopmentStart) > 4 THEN
    DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%Y%m'), '%m/01/%Y')
   ELSE
    DATE_FORMAT(STR_TO_DATE(cdevelopmentStart, '%Y'), '01/01/%Y')
   END
  END
 END AS developmentSort,
 CASE WHEN courses.cstatus = 'Complete' THEN
  0
 ELSE
  CASE WHEN courses.cstatus = 'Cancelled' THEN
   1
  ELSE
   CASE WHEN courses.cstatus = 'Hold' THEN
    2
   ELSE
    CASE WHEN courses.cstatus = 'Review' THEN
     3
    ELSE
     CASE WHEN courses.cstatus = 'Rework' THEN
      4
     ELSE
      CASE WHEN courses.cstatus = 'Open' THEN
       5
      ELSE
       6
      END
     END
    END
   END
  END
 END AS statusSort

然后,我将data-text="' . $result['developmentSort'] . '" 和data-text="' . $result['statusSort'] . '" 添加到PHP 生成的表的相应列中。最后,我设置了默认排序并指示它从data-text 属性中提取(如果已设置),方法是将以下内容添加到<HEAD>:

$("#mainlist").tablesorter({
 textAttribute: 'data-text',
 usNumberFormat: true,
 sortList: [[19, 0], [6, 1], [0, 1]]
});

感谢 Mottie 的快速回复和解决方案。 :)

【问题讨论】:

    标签: jquery tablesorter date-sorting


    【解决方案1】:

    也许最简单的解决方案是为每个包含“正确”格式日期字符串的表格单元格添加一个数据属性

    <td data-text="1/1/2015">2015 01</td>
    

    那么,如果你使用我的fork of tablesorter,你可以使用下面的代码(demo):

    $(function () {
        $('table').tablesorter({
            theme: 'blue',
            // data-attribute that contains alternate cell text
            textAttribute: 'data-text',
            // false for German "1.234.567,89" or French "1 234 567,89"
            usNumberFormat: true
        });
    });
    

    如果您必须使用原始的tablesorter,那么您可以使用此代码与相同的HTML (demo):

    $(function () {
        $('table').tablesorter({
            // set to "us", "pt", "uk", "dd/mm/yy"
            dateFormat: "us",
            // custom table cell text extraction method
            textExtraction: function (node) {
                var $node = $(node);
                return $node.attr('data-text') || $node.html();
            }
        });
    });
    

    【讨论】:

    • 天才。我不得不修改查询以创建专门包含格式化信息的附加列,但效果很好。 :)
    【解决方案2】:

    一旦你把日期拉进去,我就会把它们做成相同的格式。因此,对于“2014”的日期,将其设为“1/1/2014”。对于“2014/6”的日期,将其设为“6/1/2014”。您应该能够对它们进行排序,因为它们都是相同格式的日期。

    【讨论】:

    • 这就是我想做的,但楼上的人说他们希望将所有内容都按照最初输入的方式列出。所以,我必须让它在脚本中工作,而不仅仅是 MySQL。我将能够在早上更好地查看 tablesorter,希望它会为我一起出现。 ^^'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    相关资源
    最近更新 更多