Ho un database in cui nella colonna "BIRTH_DATE"
c'è una data (ad esempio 2015-06-26
). Io uso DataTables
per visualizzare le informazioni per gli utenti. Voglio effettuare la ricerca dell'intervallo numerico. Ma quando sto usando il plugin DataTables
ColumnFilter
e provo a usare il filtro di tipo number-range
, non funziona.DataTable columnFilter filtering range-range
Non appena inserisco alcun valore nel campo from
o to
, mi viene comunicato che non ci sono risultati. Ma se nella stessa colonna c'è una riga dove la data è scritta come quella, il filtro 20150626
lo mostra. Quindi, come ho capito, il problema è nel simbolo -
a metà del mio numero. Come posso fare in modo che il filtro ignori il segno -
?
codice del filtro Numero-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();
});
}
EDIT: 2015-06-29
O forse qualcuno mi potrebbe contribuire a rendere questo filtro ignora il formato di input basta eseguire un'azione semplice come per esempio:
Select * from table where BIRTH_DATE between '2010' and '2011-12'
Perché la query funziona correttamente in sql.
mia colonna '' BIRTH_DATE' è tipo varchar'. E io non posso cambiare, perché sto ottenendo grandi confezioni di nuovi dati ogni giorno e nei dati che ricevo 'colonna BIRTH_DATE' è' varchar'. Se lo cambio dovrò farlo ogni volta che voglio caricare nuovi dati. – hockeyman
colonne Data accetteranno date stringa nell'inserto in modo da non importa che ciò che si riceve è elencato come varchar, basta inserire questo e MySQL inserirà in una colonna DATE. https://dev.mysql.com/doc/refman/5.1/en/datetime.html –
E NON ascoltare chi ti dice di memorizzare le date in qualsiasi colonna tranne DATE o DATETIME, non appena lo fai puoi non utilizzare le funzioni di data incorporata e finire con problemi come questo. Inoltre, i datatables non si preoccupano di ciò che i dati sono archiviati come in un database, sono tutte stringhe in html. È importante che il formato sia corretto perché il filtro daterange funzioni. –