5

列に日付があるデータベースが"BIRTH_DATE"あります(たとえば2015-06-26)。DataTablesユーザー向けの情報を表示するために使用します。番号範囲検索をしたい。しかし、DataTablesプラグインを使用していてタイプ フィルターColumnFilterを使用しようとすると、number-range機能しません。

fromまたはフィールドに値を入力するとすぐにto、結果がないことがわかります。20150626しかし、同じ列に、そのフィルターが示すように日付が書かれている行がある場合。私が理解しているように、問題は-私の番号の真ん中にあるシンボルです。-フィルターが記号を無視するようにするにはどうすればよいですか?

Number-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();

        });


    }

編集:2015-06-29

または、誰かが私を助けて、このフィルターが入力フォーマットを無視するようにするだけで、次のような単純なアクションを実行できます。

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

そのようなクエリはSQLで正常に機能するためです。

4

4 に答える 4

3

私も問題に直面しました:

次の 2 つの理由が考えられます。

1) の値は秒単位iMinでなければなりません。この getTime() をチェックすることを意味iMaxますiValuenumber of milliseconds since 1970/01/01

例えば

var iMin = document.getElementById(sFromId).value

比較のために(iMin == "" && iValue < iMax)算術演算子 ( =,<,>) を使用しているため、これら 3 つの変数の値は数値でなければなりません。

2) 最初にこれを確認してください:あなたの日付形式は次のようになっていると思います。2015-06-26日付をこの形式に変換2015/06/26して機能させる必要があります。理由はわかりませんが、場合によってはjqueryが受け入れられず 1970-01-011970/01/01完全に機能します。

私の機能を見てください

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

私の機能では

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

この行で

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

この後、日付オブジェクトを作成し、関数を使用し-て取得しました/getTime()number of milliseconds since 1970/01/01

だから私は推測します(私はあなたのHTMLについて何も知らないので)これはあなたを助けるでしょう.

于 2015-07-02T11:36:25.683 に答える
1

あなたの列のタイプは何BIRTH_DATEですか?

私のアドバイスは、 (正確な時間なしでもかまいませんが、のdatetimeように見えるもの)にすることです。列タイプを に設定すると、 データテーブルを並べ替えることができます。2015-06-26 16:10:18.820
datatimedate

DataTables の column.type の詳細については、こちらを参照してください https://datatables.net/reference/option/columns.type

于 2015-06-26T14:11:40.933 に答える
0

まず、必要に応じて、データベースでテーブルの更新を実行して、birth_date列の「-」を削除します。

BIRTH_DATE次に、 varchar を目的の形式にフォーマットする挿入前に、データベースにトリガーを作成します。

number_rangeその後、 での最初の検索でフィルタリングできるようになりますdatatable

しかし、Mazet が言ったように、最高のクエリ パフォーマンスを得るには datetime を使用する方がよいでしょう。これが不可能な場合は、上記の簡単な回避策があります。

于 2015-07-01T21:33:48.077 に答える
0

number-range試してみる代わりにdate-rangeここで例を参照してください

于 2015-06-29T06:23:25.500 に答える