Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php DataTables列筛选器编号范围筛选_Php_Sql_Filter_Datatables_Datatables 1.10 - Fatal编程技术网

Php DataTables列筛选器编号范围筛选

Php DataTables列筛选器编号范围筛选,php,sql,filter,datatables,datatables-1.10,Php,Sql,Filter,Datatables,Datatables 1.10,我有一个数据库,在列“出生日期”中有日期(例如2015-06-26)。我使用DataTables为用户显示信息。我想进行数字范围搜索。但是当我使用DataTablespluginColumnFilter并尝试使用number-range类型过滤器时,它不起作用 只要我在from或to字段中输入任何值,它就会告诉我没有结果。但若在同一列中,有一行的日期是这样写的,20150626filter会显示它。据我所知,问题出在我号码中间的符号-。如何使筛选器忽略-符号 数字范围过滤器代码: functio

我有一个数据库,在
列“出生日期”
中有日期(例如
2015-06-26
)。我使用
DataTables
为用户显示信息。我想进行数字范围搜索。但是当我使用
DataTables
plugin
ColumnFilter
并尝试使用
number-range
类型过滤器时,它不起作用

只要我在
from
to
字段中输入任何值,它就会告诉我没有结果。但若在同一列中,有一行的日期是这样写的,
20150626
filter会显示它。据我所知,问题出在我号码中间的符号
-
。如何使筛选器忽略
-
符号

数字范围过滤器代码:

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();

        });


    }

因为这样的查询在sql中工作得很好

您的栏的类型是什么
出生日期

我的建议是将其设置为
日期时间(类似于
2015-06-26 16:10:18.820,但也可能没有精确的时间)。
如果将列类型设置为
date
,则数据表可以按
datatime
排序


有关column.type的更详细说明,请参见此处,在DataTables中键入,而不是
数字范围
尝试
日期范围

首先,在数据库中运行表更新,删除
出生日期
列中的“-”

其次,在插入之前,在数据库中创建一个触发器,将
出生日期
varchar格式化为所需格式

然后,您将能够在
数据表
中使用您的初始
number\u范围
搜索进行筛选


但是,正如Mazet所说,最好使用datetime以获得最佳查询性能。如果这是不可能的,那么您可以在上面找到我的快速解决方法。

我也遇到了这个问题:

可能有两个原因:

1)
iMin
iMax
iValue
的值必须在 秒表示自1970/01/01以来的
毫秒数
这个

例如

var iMin = document.getElementById(sFromId).value
因为要进行比较(
(iMin==“”&&iValue
您使用的是算术运算符(
=,
),所以这三个变量的值必须是数字

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;
      }
    );
在这一行

 minDateFilter = new Date( chart.XminDate.replace(/\-/g,'/') ).getTime();
我将
-
替换为
/
,在此之后,我创建了一个日期对象,然后在其上使用
getTime()
函数来获取自1970/01/01以来的
毫秒数


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

我的专栏
BIRTH\u DATE
varchar
类型。我无法更改它,因为我每天都会收到大量的新数据,而我收到的
BIRTH\u DATE
列中的数据是
varchar
。如果我更改它,我将不得不在每次上传新数据时都这样做。日期列将在插入中接受字符串日期,因此您收到的内容列为varchar并不重要,只需输入它,MySQL就会将其插入到日期列中。不要听任何人说要在DATE或DATETIME列以外的任何列中存储日期,一旦这样做,就无法使用内置的日期函数,最终会出现类似这样的问题。此外,datatables并不关心数据库中存储的数据是什么,而是html中的所有字符串。daterange筛选器工作的格式是否正确才重要。已尝试使用alredy。首先,日期范围对我来说根本不起作用。第二,我需要输入文本字段而不是日期选择器
 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();