【问题标题】:jqgrid: MySQL specific problems when sorting a date columnjqgrid:对日期列进行排序时的 MySQL 特定问题
【发布时间】:2015-08-31 07:59:22
【问题描述】:

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

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

未捕获的 TypeError: u.parseDate.call(...).getTime 不是函数

我在网上到处搜索,但找不到任何东西。与 jqGrid 结合出现此错误似乎是非常罕见的情况。
我仔细检查了 jqGrid 中的所有内容,但似乎没有错。


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

查看数据库中的数据后,我看到日期列中有很多“零日期”。较旧的 MySQL 数据库通常使用它而不是 NULL:“0000-00-00”或“0000-00-00 00:00:00”。

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

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

【问题讨论】:

    标签: javascript jquery mysql jqgrid free-jqgrid


    【解决方案1】:

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

    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的新来源。

    【讨论】:

    • 哦,太好了!那么在使用较新的 free-jqgrid 版本时,我不必自己处理这个问题。太棒了,谢谢!
    • @low_rents:不客气!并再次感谢您报告问题。越多的人报告他/她发现的所有错误,我们得到的代码就越干净。
    • 没问题。我不确定这是否可以称为“错误”,因为“0000-00-00”通常不被视为有效日期。
    • @low_rents:我分析了代码并发现了另一个可能存在相同问题的地方。所以我修改了代码once more。如果您下载了以前的版本,我建议您再次刷新源。我希望这是错误的最终更改。
    • 好的,谢谢!我现在没有时间测试它。我在生产中使用 free-jqgrid,所以我不能经常更改版本。但我希望我有时间在接下来的几天里升级和测试它。
    【解决方案2】:

    查看数据库中的数据后,我看到日期列中有很多“零日期”。较旧的 MySQL 数据库经常使用它而不是 NULL: "0000-00-00" 或 "0000-00-00 00:00:00"。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      相关资源
      最近更新 更多