我们在单个数据库中跟踪项目进展。在过去的两年里,管理层的要求改变了我们存储日期的格式(最初是年,然后是年月,现在是完整日期)。为了确保没有来自数据库的投诉,前管理员设置了该表以将日期存储在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。:)
也许最简单的解决方案是为每个包含"正确"格式的日期字符串的表单元格添加一个数据属性
<td data-text="1/1/2015">2015 01</td>
然后,如果你使用我的fork-oftablesorter,你可以使用以下代码(演示):
$(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
});
});
如果您必须使用原始的表分类器,那么您可以将此代码与相同的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日"。你应该能够对它们进行排序,因为它们都是相同格式的日期。