Group dates that are in Mysql in PHP

Asked

Viewed 65 times

1

I have a Mysql table called apartamento_data, in it there are dates that the apartment is rented, ie unavailable for rent. Each line a date, so:

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

What I need, make a query and list these dates grouped by period, ie, I take the days that are consecutive and list only the first and the 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 is 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 date handling in PHP, within the foreach, right?

  • need to break by month? anyway, post your current query to help ;)

  • 1

    Why are 6 dates only 4? Because they are continuous periods? It would not be convenient to create "data_start" and "data_end" columns instead of registering them in separate rows?

  • 1

    Oops, I edited the question, I spelled it wrong. @Andersoncarloswoss would be yes, but the database is not mine, it’s the client’s, I’m just doing this query to generate an XML

  • Interesting your question, but I have a doubt, the date of beginning and end of the lease are on different lines?

  • @Weessmith yes. Each row of the table has a date. That’s great difficulty. I need to know when the difference between them is greater q a day and treat (know when it’s greater than a day I can do)

  • I still don’t understand these dates rsrs, if I book an apartment for three days, the bank will have three records, one for each day? This?

  • @Ipfranz that’s right!

Show 2 more comments

1 answer

0


I ended up getting, maybe it is not the ideal and most effective way, but it worked, follow the code commented, if you have doubts 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;
    }

Browser other questions tagged

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