Javascript jqgrid:对日期列排序时MySQL特有的问题
在过去的几个月里,我遇到了这个问题好几次(我总是忘记这个问题的根源是什么),我决定在这里发布我的问题和答案 这是关于Javascript jqgrid:对日期列排序时MySQL特有的问题,javascript,jquery,mysql,jqgrid,free-jqgrid,Javascript,Jquery,Mysql,Jqgrid,Free Jqgrid,在过去的几个月里,我遇到了这个问题好几次(我总是忘记这个问题的根源是什么),我决定在这里发布我的问题和答案 这是关于colModel中可排序日期列的问题;这里有一个简单的例子: { name:'my_date', index:'my_date', width:100, search: false, sort: true, sorttype: 'date', formatter: 'date', formatoptions: {srcformat: 'Y-m-d', ne
colModel
中可排序日期列的问题;这里有一个简单的例子:
{
name:'my_date', index:'my_date', width:100, search: false, sort: true,
sorttype: 'date', formatter: 'date',
formatoptions: {srcformat: 'Y-m-d', newformat: 'd.m.Y'}
}
在jqgrid中单击此列的标题对其进行排序时,我不断遇到以下错误:
未捕获类型错误:u.parseDate.call(…)。getTime不是函数
我在网上到处搜索,什么也找不到。与jqGrid一起出现此错误似乎是非常罕见的情况。我反复检查了jqGrid中的所有内容,但我似乎没有出错
更新
既然我接受了Oleg的回答,下面是导致问题的原因和我的解决方法:
在查看了数据库中的数据之后,我在date列中看到了很多“零日期”。较旧的MySQL数据库经常使用此选项而不是NULL:“0000-00-00”或“0000-00-00:00:00” 事实证明,这就是问题的根源——jqgrid无法处理这些“零日期”。所以我所要做的就是操纵我的MySQL结果集:
CASE WHEN `my_date` = '0000-00-00' THEN ''
ELSE `my_date`
END `my_date`
在查看了数据库中的数据之后,我在date列中看到了很多“零日期”。较旧的MySQL数据库经常使用此选项,而不是
NULL
:“0000-00-00”或“0000-00-00:00:00”
事实证明,这就是问题的根源——jqgrid无法处理这些“零日期”。所以我所要做的就是操纵我的MySQL结果集:
CASE WHEN `my_date` = '0000-00-00' THEN ''
ELSE `my_date`
END `my_date`
谢谢你的错误报告!问题的原因如下。对于日期
0000-00-00
,内部方法jgrid.parseDate
返回字符串“ ;”
(请参阅):
if (ts.m === 0 && ts.y === 0 && ts.d === 0) {
return " ";
}
在另一边
只需调用.getTime()
以获得$.jgrid.parseDate
的结果。我现在承诺将上述findSortKey
代码修改为以下内容
findSortKey = function ($cell) {
var datetime = jgrid.parseDate.call(context, dfmt, $cell);
// datetime could be the string " "
return datetime instanceof Date ? datetime.getTime() : 0;
};
它应该可以解决您报告的问题。请尝试新的资源。哦,太好了!那么,当使用较新的免费jqgrid版本时,我就不必自己处理这个问题了。太棒了,谢谢你@低租金:不客气!再次感谢您报告这个问题。越多的人报告他/她发现的所有bug,我们的代码就越干净。没问题。我不确定这是否可以称为“bug”,因为“0000-00-00”通常被认为是无效日期。@low_rents:我分析了代码,发现还有一个地方可能存在同样的问题。所以我修改了代码。如果您下载了以前的版本,我建议再次刷新源代码。我希望这是bug的最终更改。好的,谢谢!我现在没有时间测试它。我在生产中使用免费的jqgrid,所以我不能经常更改版本。但我希望在接下来的几天里我能有时间升级和测试它。
findSortKey = function ($cell) {
var datetime = jgrid.parseDate.call(context, dfmt, $cell);
// datetime could be the string " "
return datetime instanceof Date ? datetime.getTime() : 0;
};