复杂的表格排序(Complex Table Sorting)

2019-10-21 04:51发布

我们跟踪在一个单一的数据库项目的进展。 在过去的两年中,管理的要求已经改变了我们保存日期的格式(最初,只是一年,那么一年一个月,现在满日期)。 为了确保没有从数据库投诉,以前的管理员设置为存储在日期表varchar ,而不是date 。 我创建了一个网络接口,为用户访问并生成报告,但网页是静态的(用户端)。 管理层希望能够通过点击表头排序。 这很容易。 我的问题是这些日期! 由于格式的,他们不排序正确。

这里的日期从PHP中出现三种形式: %Y%Y%m ,和%c/%e/%Y

我用的tablesorter排序表,但我无法弄清楚如何通过jQuery的日期进行排序。 该inital排序在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的排序的日期列。

但愿,我会后,晚上休息更多的运气,但我想如果有人张贴这件事可以给我一个领先地位。 ^^

解:

我修改了查询,而不是由条件初步排序,离开它默认的排序和创建附加列填充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属性,如果设置,通过将以下的<HEAD>

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

谢谢你,Mottie,快速回复和解决方案。 :)

Answer 1:

也许最简单的解决办法是将一个数据属性添加到其中包含了“正确”格式的日期字符串每个表格单元格

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

那么,如果你用我的tablesorter的叉子 ,你可以使用下面的代码( 演示 ):

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


Answer 2:

一旦你拉的日期,我将让他们都相同的格式。 所以对于“2014”的日期,使其“2014年1月1日”。 对于“六分之二千○一十四”的日期,使其“2014年6月1日”。 他们应该能够将它们的所有排序,因为他们都将在同一个格式的日期。



文章来源: Complex Table Sorting