jqgrid:MySQL 对日期列进行排序时的具体问题

jqgrid: MySQL specific problems when sorting a date column

在过去几个月 运行 几次遇到这个问题之后(我总是忘记这个问题的根源是什么),我决定 post 我的问题和答案在这里。

这是关于您的 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 中单击标题对该列进行排序时,我不断收到此错误:

Uncaught TypeError: u.parseDate.call(...).getTime is not a function

我在网上到处找,没找到。与 jqGrid 结合使用时出现此错误似乎是一种非常罕见的情况。
我加倍 triple-checked 我的 jqGrid 中的所有内容,但我似乎没有错误。


更新
自从我接受了 Oleg 的回答后,这是导致问题的原因和我的解决方法:

查看数据库中的数据后,我在日期列中看到了很多 "zero dates"。较早的 MySQL 数据库经常使用这个而不是 NULL:“0000-00-00”或“0000-00-00 00:00:00”。

事实证明这是导致问题的原因 - jqgrid 无法处理这些 "zero dates"。所以我所要做的就是操纵我的 MySQL 结果集:

CASE WHEN `my_date` = '0000-00-00' THEN ''
    ELSE `my_date`
END `my_date`

查看数据库中的数据后,我在日期列中看到了很多 "zero dates"。较旧的 MySQL 数据库经常使用此代替 NULL:“0000-00-00”或“0000-00-00 00:00:00”。

事实证明这是导致问题的原因 - jqgrid 无法处理这些 "zero dates"。所以我所要做的就是操纵我的 MySQL 结果集:

CASE WHEN `my_date` = '0000-00-00' THEN ''
    ELSE `my_date`
END `my_date`

感谢您的错误报告!问题的原因如下。内部方法 jgrid.parseDate returns 字符串 " " (参见 the lines)如果日期 0000-00-00:

if (ts.m === 0 && ts.y === 0 && ts.d === 0) {
    return " ";
}

另一边the code

findSortKey = function ($cell) {
    return jgrid.parseDate.call(context, dfmt, $cell).getTime();
};

只是调用 .getTime() 得到 $.jgrid.parseDate 的结果。我现在承诺 the fix 将上面的 findSortKey 代码修改为以下

findSortKey = function ($cell) {
    var datetime = jgrid.parseDate.call(context, dfmt, $cell);
    // datetime could be the string " "
    return datetime instanceof Date ? datetime.getTime() : 0;
};

它应该可以解决您报告的问题。请尝试 free jqGrid.

的新来源