2015-06-26 4 views
5

Ich habe Datenbank wo in Spalte "BIRTH_DATE" gibt es Datum (zum Beispiel 2015-06-26). Ich verwende DataTables, um Informationen für Benutzer anzuzeigen. Ich möchte die Nummernbereichssuche durchführen. Aber wenn ich DataTables Plugin ColumnFilter verwende und versuche, number-range Typ Filter zu verwenden, funktioniert es nicht.DataTables columnFilter Anzahl-Bereich Filterung

Sobald ich einen Wert zu from oder to Feld eingeben, sagt mir, dass es keine Ergebnisse gibt. Aber wenn in derselben Spalte eine Zeile steht, in die das Datum geschrieben wird, zeigt 20150626 den Filter an. So, wie ich verstehe, ist das Problem in Symbol - in der Mitte meiner Nummer. Wie kann ich Filter - ignorieren lassen?

Anzahl Range Filtercode:

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

Oder vielleicht könnte jemand mir helfen, diese Filter zu machen Eingabeformat einfach ignorieren einfache Aktion wie zum Beispiel laufen:

Select * from table where BIRTH_DATE between '2010' and '2011-12' 

Da Abfrage wie das funktioniert gut in SQL.

Antwort

1

Was ist der Typ Ihrer Spalte BIRTH_DATE?

Mein Rat wäre, es zu einem datetime (etwas, das wie 2015-06-26 16:10:18.820 aussieht, obwohl es auch ohne die genaue Stunde sein kann).
Datatables können nach datatime sortieren, wenn Sie Ihren Spaltentyp auf date einstellen.

Sehen Sie hier, um eine detaillierte Beschreibung von column.type in Tables https://datatables.net/reference/option/columns.type

+0

Meine Spalte 'BIRTH_DATE' ist' varchar' Typ. Und ich kann es nicht ändern, weil ich jeden Tag große Mengen neuer Daten erhalte und in den Daten, die ich in der Spalte "BIRTH_DATE" erhalte, steht 'varchar'. Wenn ich es ändere, muss ich es jedes Mal tun, wenn ich neue Daten hochladen möchte. – hockeyman

+0

Datumsspalten akzeptieren String-Daten in der Einfügung, so dass es egal ist, dass das, was Sie erhalten, als varchar aufgelistet ist, geben Sie einfach das ein und MySQL fügt es in eine DATE-Spalte ein. https://dev.mysql.com/doc/refman/5.1/en/datetime.html –

+1

Und hören Sie nicht auf jemanden, der Ihnen sagt, Daten in etwas außer DATE oder DATETIME Spalten zu speichern, sobald Sie das tun können Sie verwende die eingebauten Datumsfunktionen nicht und erhalte Probleme wie diese. Datatabellen ist es auch egal, wie die Daten in einer Datenbank gespeichert werden, es sind alle Strings in HTML. Es ist nur wichtig, dass das Format korrekt ist, damit der Datumsbereichsfilter funktioniert. –

0

Statt number-rangedate-range versuchen. See example here

+0

Bereits erprobt. Zunächst einmal funktioniert das für mich überhaupt nicht. Zweitens - ich brauche Eingabe, um Text-Feld nicht Datumsauswahl zu sein – hockeyman

+0

können Sie eine Geige oder einen Beitrag ein Code-Snippet machen? –

+0

Frage aktualisiert – hockeyman

0

Führen Sie zunächst ein Update in Ihrer Datenbank zu Ihrer Tabelle aus, um das "-" in der Spalte birth_date zu löschen, falls erforderlich.

Zweitens erstellen Sie einen Trigger in Ihrer Datenbank vor dem Einfügen, die BIRTH_DATE Varchar auf das gewünschte Format formatiert.

Dann können Sie mit Ihrer ursprünglichen number_range Suche in der datatable filtern.

Aber, wie Mazet sagte, wäre es besser, datetime für die beste Abfrageleistung zu verwenden. Wenn das nicht möglich ist, dann haben Sie oben meine schnelle Abhilfe.

3

ich auch das Problem konfrontiert:

Es könnte zwei Gründe haben:

1) Wert von iMin, iMax, iValue in Sekunden bedeutet diesen getTime()

in number of milliseconds since 1970/01/01 Prüfung sein muss

zB

var iMin = document.getElementById(sFromId).value 

Da zum Vergleich (iMin == "" && iValue < iMax) Sie arithmetische Operatoren verwenden (=,<,>), so muss der Wert dieser drei Variablen numerisch sein.

2) Bitte bestätigen Sie dies zuerst: Ich denke, Ihr Datumsformat wie dieses 2015-06-26 Sie haben ist 2015/06/26 Datum in dieses Format zu konvertieren, damit es funktioniert. Nicht sicher warum, aber in einigen Fällen akzeptiert jquery nicht 1970-01-01 und 1970/01/01 funktioniert perfekt.

Werfen Sie einen Blick auf meine Funktion

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

In meiner Funktion

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

In dieser Zeile

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

I - mit / danach ersetzt habe ich erstellt habe ein Datumsobjekt und t Henne Ich habe getTime() Funktion früher bekommen number of milliseconds since 1970/01/01

Also ich denke, (wie ich keine Ahnung über Ihre HTML haben) Dies wird Ihnen helfen.