Group dates that are in MySQL in PHP

1

I have a table in MySQL called apartamento_data , in it there are dates that the apartment is rented, that is, unavailable for rent. Each row a date, like this:

2017-05-31
2017-06-01
2017-06-04
2017-06-05
2017-06-06

What I need, to do a query and list these dates grouped by period, that is, I take the days that are consecutive and only the first and last, in the example above would look like this:

de 2017-05-31 até 2017-06-01 
de 2017-06-04 até 2017-06-06 

How to do this via PHP? My query looks like this:

SELECT apartamento_data.data_locado FROM apartamento
LEFT JOIN apartamento_data ON apartamento.id = partamento_data.idapartamento
WHERE apartamento.id=:qualApartamento
ORDER BY apartamento_data.data_locado ASC

But I believe I have to do this sort of date processing in PHP, within foreach , right?

    
asked by anonymous 05.06.2018 / 18:56

1 answer

0

I just got it, maybe it is not the ideal and most effective way, but it worked, follow the commented code, if you have any questions just ask:

    $sql = $pdo->prepare('SELECT apartamento_data.data_locado FROM apartamento
        LEFT JOIN apartamento_data ON apartamento.id = apartamento_data.idapartamento
        WHERE apartamento.ativo = "1" AND apartamento.flipkey = "1" AND apartamento.id=:qualApartamento
        ORDER BY apartamento_data.data_locado ASC');
    $sql->execute(array("qualApartamento" => $qual));
    $resultadoSql_Apartamento = $sql->fetchAll();
    $totalConsulta = count($resultadoSql_Apartamento);
    //
    $data_compara = "2000-00-00"; // setei uma data inicial bem antiga para comparação inicial (a primeira data sempre será a data inicial)
    $primeira_consulta = 1; // variável para saber se é a primeira consulta
    $conta_consultas = 1;
    $ultima_consulta = 0; // varíavel para saber se a última data chegou
    foreach($resultadoSql_Apartamento as $valorSql) {
        $data_locado = utf8_encode($valorSql['data_locado']);
        //
        // checa se a diferença dentre as datas é maior que 1 dia
        $diferenca = strtotime($data_locado) - strtotime($data_compara);
        $diferenca = floor($diferenca / (60 * 60 * 24));
        //
        // se a diferença for maior que um, ou seja, não é consecutiva)
        if($diferenca != 1){
            // se for a primeira consulta (uso para o sistema não listar a data final da primeira sequencia de dias antes da primeira)
            if($primeira_consulta == 1){
                $primeira_consulta = 2;
                // listo a data inicial
                echo "de ".$data_locado." até ";
            }else{
                // listo a data final (pego a variável $data_compara que é só aliemntada no final do loop)
                echo $data_compara."<br>";
                // digo que chegou a última data
                $ultima_consulta = 1;
                // listo a data inicial (uma nova sequencia sempre se incia se não for a última data)
                if($totalConsulta > $conta_consultas){
                    echo "de ".$data_locado." até ";
                    $primeira_consulta = 2;
                    // digo que na verdade não chegou na última data
                    $ultima_consulta = 0;
                }
            }
        }
        //
        $data_compara = $data_locado;
        $conta_consultas++;
    }
    // mostro a última data
    if($ultima_consulta == 0){
        echo $data_locado;
    }
    
05.06.2018 / 19:59