5

我有数据库,列"BIRTH_DATE"中有日期(例如2015-06-26)。我用来DataTables为用户显示信息。我想做数字范围搜索。但是当我使用DataTables插件ColumnFilter并尝试使用number-range类型过滤器时它不起作用。

只要我输入任何值fromto字段,它就会告诉我没有结果。但是,如果在同一列中有一行写日期,就像20150626过滤器显示的那样。所以据我了解,问题出在-我号码中间的符号中。我怎样才能使过滤器忽略-标志?

数字范围过滤器代码:

function fnCreateCharRangeInput() {

        th.html(_fnRangeLabelPart(0));
        var sFromId = sTableId + 'range_from_' + i;
        var from = $('<input type="text" class="number_range_filter" id="' + sFromId + '" rel="' + i + '"/>');
        th.append(from);
        th.append(_fnRangeLabelPart(1));
        var sToId = sTableId + 'range_to_' + i;
        var to = $('<input type="text" class="number_range_filter" id="' + sToId + '" rel="' + i + '"/>');
        th.append(to);
        th.append(_fnRangeLabelPart(2));
        th.wrapInner('<span class="filterColumn filter_number_range" />');
        var index = i;
        aiCustomSearch_Indexes.push(i);



        //------------start range filtering function


        /*  Custom filtering function which will filter data in column four between two values
        *   Author:     Allan Jardine, Modified by Jovan Popovic
        */
        $.fn.dataTableExt.afnFiltering.push(
            function (oSettings, aData, iDataIndex) {
                var iMin = document.getElementById(sFromId).value * 1;
                var iMax = document.getElementById(sToId).value * 1;
                var iValue = aData[index] == "-" ? 0 : aData[index] * 1;
                if (iMin == "" && iMax == "") {
                    return true;
                }
                else if (iMin == "" && iValue < iMax) {
                    return true;
                }
                else if (iMin < iValue && "" == iMax) {
                    return true;
                }
                else if (iMin < iValue && iValue < iMax) {
                    return true;
                }
                return false;
            }
        );
        //------------end range filtering function



        $('#' + sFromId + ',#' + sToId, th).keyup(function () {

            var iMin = document.getElementById(sFromId).value * 1;
            var iMax = document.getElementById(sToId).value * 1;
            if (iMin != 0 && iMax != 0 && iMin > iMax)
                return;

            oTable.fnDraw();

        });


    }

编辑:2015-06-29

或者也许有人可以帮助我让这个过滤器忽略输入格式,只需运行简单的操作,例如:

Select * from table where BIRTH_DATE between '2010' and '2011-12'

因为这样的查询在 sql 中运行良好。

4

4 回答 4

3

我也遇到过这个问题:

可能有两个原因:

1)iMin , iMax, 的值iValue必须以秒为单位表示number of milliseconds since 1970/01/01检查此getTime()

例如

var iMin = document.getElementById(sFromId).value

因为(iMin == "" && iValue < iMax)您使用算术运算符(=,<,>)进行比较,所以这三个变量的值必须是数字。

2) 请先确认这一点:我猜你的日期格式是这样的2015-06-26你必须将日期转换为这种格式2015/06/26才能使其工作。不知道为什么,但在某些情况下 jquery 不接受 1970-01-01并且1970/01/01可以完美运行。

看看我的功能

$.fn.dataTableExt.afnFiltering.push(
      function(oSettings, aData, iDataIndex) {
        if(chart.XminDate != '' && chart.XmaxDate !=  ''){
            minDateFilter = new Date( chart.XminDate.replace(/\-/g,'/') ).getTime();
            maxDateFilter = new Date( chart.XmaxDate.replace(/\-/g,'/') ).getTime();
            aData._date = new Date( aData[3].replace(/\-/g,'/') ).getTime();
            if (minDateFilter) {
                if (aData._date < minDateFilter) {
                    return false;
                }
            }
            if (maxDateFilter) {
                if (aData._date > maxDateFilter) {
                    return false;
                }
            }
            return true;
        }
        return true;
      }
    );

在我的功能中

 var iMin = document.getElementById(sFromId).value * 1; /*same as chart.XminDate */
 var iMax = document.getElementById(sToId).value * 1; /*same as chart.XmaxDate */
 var iValue = aData[index] == "-" ? 0 : aData[index] * 1; /*same as aData._date */

在这一行

 minDateFilter = new Date( chart.XminDate.replace(/\-/g,'/') ).getTime();

我已经替换-/在此之后我创建了一个日期对象,然后我getTime()在它上面使用了函数来获取number of milliseconds since 1970/01/01

所以我猜(因为我不知道你的 HTML)这会对你有所帮助。

于 2015-07-02T11:36:25.683 回答
1

你的专栏是什么类型的BIRTH_DATE

我的建议是把它做成一个datetime(看起来像2015-06-26 16:10:18.820,虽然它也可以没有精确的时间)。如果您将列类型设置为,则
数据表可以排序。datatimedate

有关 DataTables 中 column.type 的更详细说明,请参见此处https://datatables.net/reference/option/columns.type

于 2015-06-26T14:11:40.933 回答
0

而不是number-range尝试date-range在此处查看示例

于 2015-06-29T06:23:25.500 回答
0

首先,在您的数据库中对表运行更新以删除birth_date列中的“-”(如果需要)。

其次,在插入之前在数据库中创建一个触发器,将BIRTH_DATEvarchar 格式化为所需的格式。

然后,您将能够number_rangedatatable.

但是,就像 Mazet 所说,最好使用 datetime 来获得最佳查询性能。如果这是不可能的,那么你有我上面的快速解决方法。

于 2015-07-01T21:33:48.077 回答