2015-06-26 9 views
5

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.

Odpowiedz

1

Jaki jest typ kolumny BIRTH_DATE?

Moja rada to sprawić, że będzie to datetime (coś, co wygląda jak 2015-06-26 16:10:18.820, chociaż może być również bez dokładnej godziny).
Dane mogą być sortowane według datatime, jeśli ustawisz typ kolumny na date.

Zobacz tutaj bardziej zobaczyć szczegółowe opisu column.type w DataTables https://datatables.net/reference/option/columns.type

+0

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

+0

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 –

+1

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ł. –

0

Zamiast number-range spróbować date-range. See example here

+0

Próbowałem alredy. Przede wszystkim zakres dat nie działa dla mnie. Po drugie - potrzebuję danych wejściowych, aby być polem tekstowym, a nie próbnikiem dat. – hockeyman

+0

Czy można zrobić skrzypce lub post fragmentu kodu? –

+0

pytanie zaktualizowane – hockeyman

0

Najpierw uruchom aktualizację bazy danych w tabeli, aby w razie potrzeby usunąć kolumnę "-" w kolumnie birth_date.

Po drugie, utwórz wyzwalacz w bazie danych przed wstawieniem, który formatuje varchar BIRTH_DATE do pożądanego formatu.

Następnie będzie można filtrować za pomocą początkowego wyszukiwania number_range w datatable.

Ale, jak powiedział Mazet, lepiej byłoby użyć datetime dla najlepszej wydajności zapytania. Jeśli nie jest to możliwe, masz moje szybkie obejście powyżej.

3

Mam również w obliczu problemu:

Mogą być dwa powody:

1) Wartość iMin, iMax, iValue musi być w sekund oznacza w number of milliseconds since 1970/01/01 czeku tym getTime()

np.

var iMin = document.getElementById(sFromId).value 

Ponieważ dla porównania (iMin == "" && iValue < iMax) używasz operatorów arytmetycznych (=,<,>), więc wartość tych trzech zmiennych musi być numeryczna.

2) Proszę potwierdzić ten pierwszy: Chyba format daty jest jak ten 2015-06-26 trzeba konwertować datę do tego formatu 2015/06/26 aby to działało. Nie wiem, dlaczego, ale w niektórych przypadkach jquery nie akceptuje 1970-01-01 i 1970/01/01 działa idealnie.

rzucić okiem na mojej funkcji

$.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; 
     } 
    ); 

W mojej funkcji

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 */ 

w tej linii

minDateFilter = new Date(chart.XminDate.replace(/\-/g,'/')).getTime(); 

Wymieniłem - z / po tym Stworzyłem obiekt daty i t kura Użyłem getTime() funkcji na to, aby dostać number of milliseconds since 1970/01/01

Więc myślę (jak ja nie mają pojęcia o HTML) to pomoże.