Date sorting problems in Datatables

Asked

Viewed 683 times

2

Hello. I know there are several topics here on Stack, but I’ve tried all the options suggested in the answers and failed.

My problem is that when I click on the table header to sort it by date (after the data comes from php and displayed by Datatables), this ordering comes out all disorganized. Why are you ordering by String and not by the question of the date. I will post here the code I am using.

Remembering that I have tried these options below: (to include these libraries and did not succeed)

<!-- INCLUÍDO POR MIM ATRAVÉS DE PESQUISA -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.4/moment.min.js"></script>
<script src="https://cdn.datatables.net/plug-ins/1.10.10/sorting/datetime-moment.js"></script>

My code:

//DATA TABLE DA PÁGINA
$.fn.dataTable.moment('dd/mm/YYYY');

$('#resultado-listagem-notificacoes-recentes').DataTable({


  "processing": true,
  "serverSide": true,
  "ajax": {
    "url": "../banco/banco-get/pagina-listagem-notificacoes-recentes/php-arquivos-disponiveis.php",
    "type": "POST",

    "data": function(item) {
      //item.empresa = $('#empresa_relatorio').val();
      //item.departamento = $('#departamento_relatorio').val();
      //item.empresa_origem = $('#empresa_origem_relatorio').val();
      //item.cod = $('#cod_relatorio').val();
      //item.atividade = $('#tipo_atividade_relatorio').val();
      //item.estatus = $('#status_relatorio').val();
      // item.ano = $('#ano_relatorio').val();

    }
  },

  paging: true,
  scrollX: true,
  scrollCollapse: true,
  scrollY: "450px",
  scrollX: "900px",
  "order": [
    [3, "desc"]
  ],

  "language": {
    "lengthMenu": "Mostrando _MENU_ registros por página",
    "zeroRecords": "Nenhum registro encontrado com estes parâmetros de pesquisa",
    //"info": "Mostrando página _PAGE_ de _PAGES_",
    "info": "Listagem dos Registros",
    "infoEmpty": "Nenhum registro disponível",
    "infoFiltered": "(filtrado de _MAX_ registros no total)",
    "search": "Pesquisar:",
    "paginate": {
      "first": "Primeiro",
      "last": "Último",
      "next": "Próximo",
      "previous": "Anterior"
    },
  }

});


var table = $('#resultado-listagem-notificacoes-recentes').DataTable();
<?php

session_start();
require_once("../../conexao/conexao-com-banco.php");

	
//Receber a requisão da pesquisa 
$requestData = $_REQUEST;	


//Indice da coluna na tabela visualizar resultado => nome da coluna no banco de dados
$columns = array( 
	0 => 'titulo',
	1 => 'corpo',
	2 => 'autor', 
	3 => 'data_aviso',
	4 => 'horario'
);


//Obtendo registros de número total sem qualquer pesquisa
$contadorderegistros = "SELECT titulo,corpo,autor,DATE_FORMAT(data_aviso, '%d-%m-%Y') AS data_aviso,horario ";
$contadorderegistros .= "FROM tbl_avisos WHERE destinatario = '$usuario_logado'";


$resultado_arquiv = mysqli_query($conecta, $contadorderegistros);
$qnt_linhas = mysqli_num_rows($resultado_arquiv);


$dadosparapreenchimento = "SELECT titulo,corpo,autor,DATE_FORMAT(data_aviso, '%d-%m-%Y') AS data_aviso,horario ";
$dadosparapreenchimento .= "FROM tbl_avisos WHERE destinatario = '$usuario_logado'";



if( !empty($requestData['search']['value']) ) {   // se houver um parâmetro de pesquisa, $requestData['search']['value'] contém o parâmetro de pesquisa
   // $dadosparapreenchimento.=" and responsavel LIKE '%".$requestData['search']['value']."%'";
	$dadosparapreenchimento.=" or titulo LIKE '%".$requestData['search']['value']."%'";
    $dadosparapreenchimento.=" or corpo LIKE '%".$requestData['search']['value']."%' ";
	$dadosparapreenchimento.=" or autor LIKE '%".$requestData['search']['value']."%'";
	$dadosparapreenchimento.=" or data_aviso LIKE '%".$requestData['search']['value']."%'";
	$dadosparapreenchimento.=" or horario LIKE '%".$requestData['search']['value']."%'";

	}


$resultado_arquivos = mysqli_query($conecta, $dadosparapreenchimento);
$totalFiltered = mysqli_num_rows($resultado_arquivos);

//Ordenar o resultado
$dadosparapreenchimento .= " ORDER BY ". $columns[$requestData['order'][0]['column']]."   ".$requestData['order'][0]['dir']."  LIMIT ".$requestData['start']." ,".$requestData['length']."   ";

//ACIMA, COMENTAMOS PARA COLOCAR O ORDER BY COM O NOSSO CRITÉRIO, QUE É A DATA DE UPLOAD (QUE ESTÁ NA QUERY ABAIXO)
//$dadosparapreenchimento .= " ORDER BY data_aviso desc" . " LIMIT ".$requestData['start']." ,".$requestData['length']." " ;


$resultado_arquivos = mysqli_query($conecta, $dadosparapreenchimento);


// Ler e criar o array de dados
$dados = array();
while( $row_arquivo = mysqli_fetch_array($resultado_arquivos) ) {  
	$dado = array(); 
	//$dado[] = utf8_encode(utf8_decode($row_arquivo["responsavel"]));   //Importante usar o utf8 em campos que vão conter acento pois dara erro no JSON
	$dado[] = utf8_encode(utf8_decode($row_arquivo["titulo"]));
	//$dado[] = utf8_encode(utf8_decode($row_arquivo["departamento"]));
	$dado[] = utf8_encode(utf8_decode($row_arquivo["corpo"]));
	$dado[] = utf8_encode(utf8_decode($row_arquivo["autor"]));
	$dado[] = utf8_encode(utf8_decode($row_arquivo["data_aviso"]));
	$dado[] = utf8_encode(utf8_decode($row_arquivo["horario"]));
	$dados[] = $dado;
}

//Cria o array de informações a serem retornadas para o Javascript
$json_data = array(
	"draw" => intval( $requestData['draw'] ),//para cada requisição é enviado um número como parâmetro
	"recordsTotal" => intval( $qnt_linhas ),  //Quantidade de registros que há no banco de dados
	"recordsFiltered" => intval( $totalFiltered ), //Total de registros quando houver pesquisa
	"data" => $dados   //Array de dados completo dos dados retornados da tabela 
);

echo json_encode($json_data);  //enviar dados como formato json


?>

HOW IT’S BEING SHOWN

inserir a descrição da imagem aqui

NOTE: If you look, the date instead of going from 30-09-2019 to 29-09-2019, is going to 30-08-2019. I mean, it looks to me like it’s being ordered like String.

I have tried these answers below and could not:

insert link description here

insert link description here

1 answer

3


Good afternoon.

Import the datasorts.js plugin below the import of datatables.min.js:

<script type="text/javascript" src="DataTables/datatables.min.js"></script> 
<script type="text/javascript" src="https://cdn.datatables.net/plug-ins/1.10.20/sorting/date-eu.js"></script>

Below the imports made above, use the code below:

<script type="text/javascript">
  $(document).ready(function() {
    $('#nome_da_tabela').DataTable( {
      "columns": [
      { "type": "date-eu" },
      null,
      null,
      null,
      null
    ],
    "order": [0, 'desc'],
    responsive: true,
    "language": {
            "decimal":        "",
            "emptyTable":     "Nada para exibir",
            "info":           "Mostrando de _START_ até _END_ de _TOTAL_ registros",
            "infoEmpty":      "Exibindo página 0 de 0 de 0 registros",
            "infoFiltered":   "(filtrado do total de _MAX_ registros)",
            "infoPostFix":    "",
            "thousands":      ",",
            "lengthMenu":     "Exibir _MENU_ registros",
            "loadingRecords": "Carregando...",
            "processing":     "Processando...",
            "search":         "Buscar:",
            "zeroRecords":    "Nenhum resultado encontrado",
            "paginate": {
                "first":      "Primeira",
                "last":       "Última",
                "next":       "Próxima",
                "previous":   "Anterior"
            },
            "aria": {
                "sortAscending":  ": activate to sort column ascending",
                "sortDescending": ": activate to sort column descending"
            }
    }
    } )
} );
</script>

Explaining: Watch the excerpt

"columns": [
      { "type": "date-eu" },
      null,
      null,
      null,
      null
    ],

Where there is { "type": "date-I" }, it is the column that contains the date and that will be ordered. If the table has more columns, null should be placed in the order in which the table columns are arranged. If the number of null fields does not agree with the number of other data, the table will not be displayed correctly.

This code snippet above, for example, would serve for a table with the columns: data_birth | name | age | sex | city

If the date column is the third, the code should be for example

"columns": [
      null,
      null,
      { "type": "date-eu" },
      null,
      null
    ],

Column can be displayed in dd/mm/YYYY format:

<td><?php echo date("d/m/Y",strtotime($data['data'])); ?></td>

OBS: Just to point out, if the column is not the first, as in this example, we have to also change the "order": [0, 'desc'] for "order": [numero_da_coluna, 'desc'].

  • Very good answer, Leonardo. I used here today and funfou de boa.

  • How nice to have helped. Well placed your remark.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.