Mam bazę danych, w której w kolumnie "BIRTH_DATE"
znajduje się data (na przykład 2015-06-26
). Używam DataTables
do wyświetlania informacji dla użytkowników. Chcę wyszukać zakres numerów. Ale kiedy używam DataTables
wtyczki ColumnFilter
i spróbuj użyć filtra typu number-range
, to nie działa.DataTables columnFiltrowanie z zakresem numerów
Po wprowadzeniu dowolnej wartości w polu from
lub to
informuje mnie, że nie ma wyników. Ale jeśli w tej samej kolumnie znajduje się wiersz, w którym data jest zapisana tak, jak pokazuje to filtr 20150626
. Więc jak rozumiem problem jest w symbolu -
w środku mojej liczby. Jak mogę uczynić filtr ignorować znak -
?
Number-klasy Kod filtra:
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
A może ktoś może mi pomóc, aby ten filtr ignorować formatu wejściowego wystarczy uruchomić proste działania jak na przykład:
Select * from table where BIRTH_DATE between '2010' and '2011-12'
Ponieważ takie zapytanie działa poprawnie w sql.
Moja kolumna 'BIRTH_DATE' ma wartość' varchar'. I nie mogę tego zmienić, ponieważ codziennie otrzymuję duże pakiety nowych danych, a w danych, które otrzymuję, kolumna "BIRTH_DATE" to 'varchar'. Jeśli to zmienię, będę musiał to zrobić za każdym razem, kiedy chcę załadować nowe dane. – hockeyman
Kolumny daty będą akceptować ciągi znaków we wstawianiu, więc nie ma znaczenia, że to, co otrzymasz, jest wymienione jako varchar, po prostu wprowadź dane, a MySQL wstawi je do kolumny DATE. https://dev.mysql.com/doc/refman/5.1/en/datetime.html –
I NIE WOLNO słuchać nikogo, kto mówi Ci, aby przechowywać daty w dowolnych kolumnach oprócz DATE lub DATETIME, tak szybko, jak to zrobisz nie używaj wbudowanych funkcji daty i kończą z takimi problemami. Ponadto, datatables nie obchodzi, jakie dane są przechowywane w bazie danych, to wszystkie ciągi znaków w html. Ważne jest tylko, aby format był prawidłowy, aby filtr Daterange działał. –