复杂表格排序

时间:2014-10-30 19:26:52

标签: jquery tablesorter date-sorting

我们在单个数据库中跟踪项目进展。在过去两年中,管理层的要求改变了我们存储日期的格式(最初只是年份,然后是年月,现在是完整日期)。为确保数据库没有投诉,以前的管理员设置表格以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的快速回复和解决方案。 :)

2 个答案:

答案 0 :(得分:3)

也许最简单的解决方案是将数据属性添加到每个包含&#34;正确&#34;的表格单元格中。格式化日期字符串

<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();
        }
    });
});

答案 1 :(得分:1)

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