Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I filter date range in DataTables?

Tags:

I have a large dataTable which contains ride information. Every row has a start datetime and an end datetime of the following format(yyyy-mm-dd HH:mm:ss). How can I use a datepicker for setting a filter range in dataTables? I want to have a datepicker which only selects a day and not the time. I've searched everywhere for the proper answer but I couldn't find it. Thanks in advance for helping.

For example I want to see all rows of July by selecting (01-07-2016 - 31-07-2016).

like image 872
Novy Avatar asked Aug 02 '16 10:08

Novy


People also ask

What is date range filter?

Date Range Filters are used to limit the results on a Dashboard to data that falls in (or outside of) certain date and time groupings. Date Range Filters are available for properties with Date, DateTime, and Time data types.

What is FN DataTable ext search push?

fn. dataTable. ext.search . This is an array of functions (push your own onto it) which will will be run at table draw time to see if a particular row should be included or not. This example shows a search being performed on the age column in the data, based upon two inputs.

What is DataTables net DT?

DataTables is a table enhancing library which adds features such as paging, ordering, search, scrolling and many more to a static HTML page. A comprehensive API is also available that can be used to manipulate the table.

How many rows can DataTables handle?

The maximum number of rows that a DataTable can store is 16,777,216.


2 Answers

Here is DataTable with Single DatePicker as "from" Date Filter

LiveDemo

Here is DataTable with Two DatePickers for DateRange (To and From) Filter

LiveDemo

like image 75
mmushtaq Avatar answered Sep 30 '22 06:09

mmushtaq


Here is my solution, cobbled together from the range filter example in the datatables docs, and letting moment.js do the dirty work of comparing the dates.

HTML

<input      type="text"      id="min-date"     class="date-range-filter"     placeholder="From: yyyy-mm-dd">  <input      type="text"      id="max-date"      class="date-range-filter"     placeholder="To: yyyy-mm-dd">  <table id="my-table">     <thead>         <tr>             <th>ID</th>             <th>Name</th>             <th>Created At</th>         </tr>     </thead> </table> 

JS

Install Moment: npm install moment

// Assign moment to global namespace window.moment = require('moment');  // Set up your table table = $('#my-table').DataTable({     // ... do your thing here. });  // Extend dataTables search $.fn.dataTable.ext.search.push(     function( settings, data, dataIndex ) {         var min  = $('#min-date').val();         var max  = $('#max-date').val();         var createdAt = data[2] || 0; // Our date column in the table          if  (                  ( min == "" || max == "" )                 ||                  ( moment(createdAt).isSameOrAfter(min) && moment(createdAt).isSameOrBefore(max) )              )         {             return true;         }         return false;     } );  // Re-draw the table when the a date range filter changes $('.date-range-filter').change( function() {     table.draw(); } ); 

JSFiddle Here

Notes

  • Using moment decouples the date comparison logic, and makes it easy to work with different formats. In my table, I used yyyy-mm-dd, but you could use mm/dd/yyyy as well. Be sure to reference moment's docs when parsing other formats, as you may need to modify what method you use.
like image 28
CJ Edgerton Avatar answered Sep 30 '22 04:09

CJ Edgerton