复杂表格排序

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

以下是日期可以从PHP中显示的三种forms: %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排序中复制日期列的排序。

希望我晚上rest后会有更多的运气,但我想发布这个以防万一有人能给我一个开头。 ^^

解:

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

 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属性中提取(如果已设置),方法是将以下内容添加到

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

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

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

 2015 01 

那么,如果你使用我的fork of tableorter ,你可以使用以下代码( 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( 演示 )一起使用:

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

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