2015-06-26 18 views
5

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 DataTablesColumnFilter 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.

risposta

1

Qual è il tipo di colonna BIRTH_DATE?

Il mio consiglio sarebbe di renderlo un datetime (qualcosa simile a 2015-06-26 16:10:18.820, anche se può anche essere senza l'ora precisa).
I dati possono essere ordinati per datatime se si imposta il tipo di colonna su date.

Vedi qui per una descrizione più dettagliata dei column.type in DataTable https://datatables.net/reference/option/columns.type

+0

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

+0

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 –

+1

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

0

Invece di provare number-rangedate-range. See example here

+0

provato alredy. Prima di tutto la data non funziona affatto per me. Secondo: ho bisogno di un input per essere il campo di testo e non il selettore di date – hockeyman

+0

puoi fare un violino o un post di uno snippet di codice? –

+0

domanda aggiornata – hockeyman

0

Innanzitutto, eseguire un aggiornamento nel database nella tabella per eliminare il "-" nella colonna birth_date se necessario.

In secondo luogo, creare un trigger nel database prima di inserirlo che formatta il varchar BIRTH_DATE nel formato desiderato.

Quindi sarà possibile filtrare con la ricerca iniziale number_range nello datatable.

Ma, come ha detto Mazet, sarebbe meglio usare datetime per le migliori prestazioni di interrogazione. Se questo non è possibile, hai la mia soluzione rapida sopra.

3

Ho anche affrontato il problema:

Ci potrebbero essere due ragioni:

1) Valore della iMin, iMax, iValue devono essere in secondi significa, in number of milliseconds since 1970/01/01 controllo questo getTime()

es

Poiché per il confronto (iMin == "" && iValue < iMax) si utilizzano operatori aritmetici (=,<,>), il valore di queste tre variabili deve essere numerico.

2) Si prega di confermare questa prima: Credo che il formato della data è come questo 2015-06-26 Dovete convertire la data in questo formato 2015/06/26 per farlo funzionare. Non so perché, ma in alcuni casi jquery non accetta 1970-01-01 e 1970/01/01 funziona perfettamente.

Dai un'occhiata a mia funzione

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

Nella mia funzione

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 questa linea

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

ho sostituito - con / dopo questo ho creato un oggetto data e t uando ho usato getTime() funzione su di esso per ottenere number of milliseconds since 1970/01/01

Quindi immagino (come non ho idea circa il vostro HTML) Questo vi aiuterà.