我有数据库,其中 “BIRTH_DATE”
列中有日期(例如 2015-06-26
)。我使用 DataTables
为用户显示信息。我想进行号码范围搜索。但是,当我使用 DataTables
插件 ColumnFilter
并尝试使用 number-range
类型的过滤器时,它不起作用。
只要我在 from
或 to
字段中输入任何值,它就会告诉我没有结果。但是,如果在同一列中有一行日期写成 20150626
过滤器会显示它。据我所知,问题出在我号码中间的符号 -
中。我怎样才能让过滤器忽略 -
标志?
Number-Range 过滤代码:
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 中工作正常。
最佳答案
我也遇到过这个问题:
可能有两个原因:
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)这会对您有所帮助。
关于php - DataTables columnFilter number-range 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31073815/