【发布时间】: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