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
pluginColumnFilter
并尝试使用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();