Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Datas que faltam em um período!

Recommended Posts

Pessoal, tenho um array que traz ano-mes em um peírodo da seguinte forma


Array (
0 -> "2014-01",
1 -> "2014-03",
2 -> "2014-06",
3 -> "2014-07",
4 -> "2014-11",
5 -> "2014-12",
6 -> "2015-01",
7 -> "2015-02",
8 -> "2015-03",
9 -> "2015-04",
10 -> "2015-07",
11 -> "2015-09"
)


Existe alguma forma de eu descobrir, dado um período qualquer, quais meses faltam nesse período?

Tipo, dado o período entre 2014-1 e 2015-09,

retornar o array tipo:



Array (
0 -> "2014-02",
1 -> "2014-04",
2 -> "2014-05",
3 -> "2014-08",
4 -> "2014-09",
5 -> "2014-10",
6 -> "2015-05",
7 -> "2015-06",
8 -> "2015-08"
)


?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que com isso você já consegue fazer alguma coisa:

 

<?php


$datas =["2014-01",
"2014-03",
"2014-06",
"2014-07",
"2014-11",
"2014-12",
"2015-01",
"2015-02",
"2015-03",
"2015-04",
"2015-07",
"2015-09"
];


echo $first= current($ar);//primeira data
echo $last= end($ar);//ultima data

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa Xavier, não entendi!

 

Não dá para saber os meses que faltam só com isso. Não pelo que sei até agora!

 

Pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora que notei que não são meses consecutivos. Se não houver uma regra para definir a sequência de meses a resposta é não. Mas com certeza você tem alguma fórmula pra ter essas datas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lendo rapidinho, a solução que me veio a cabeça seria comparar a array "incompleta" com uma completa e o resultado dessa comparação ser colocado numa outra array.

 

Compara as arrays: link

Mais sobre arrays: link

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho um campo "mesCompetencia" na tabela de pagamentos onde eu guardo a competência do mês pago por um determinado cliente a um serviço de prestação continuada.
Esse campo guarda apenas o mês e o ano da competência no formato "2015-04". Esse campo esta como char (7).
Mas minha dificuldade é que preciso pesquisar quais competências ainda não foram pagas em um período que vai desde a instalação do serviço e a último competência lançada. Na verdade nem é a ultima competência. Mas a mais atual. Que poderá não ser a ultima lançada (paga).
A tabela é a seguinte:
CREATE TABLE pagamentos (
  idPagamentos INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  idPlanoClientes INT(10) NOT NULL,
  idAdmins INT(1) NOT NULL,
  mesReferencia CHAR(7) NOT NULL,
  dataPgto DATE NOT NULL,
  valorPgto DOUBLE NOT NULL,
  multa DOUBLE NOT NULL,
  desconto DOUBLE NOT NULL,
  totalPago DOUBLE NOT NULL,
  formaPgto CHAR(2) NOT NULL,
  observacao text,
  PRIMARY KEY (idPagamentos)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
A consulta que estou fazendo é a seguinte:
    SELECT pagamentos.idPagamentos, pagamentos.mesReferencia FROM pagamentos, planosclientes
    WHERE
           pagamentos.idPlanoClientes = planosclientes.idPlanosClientes AND
           pagamentos.idPlanoClientes = 8 AND
           pagamentos.mesReferencia BETWEEN DATE_FORMAT(planosclientes.dataInstalacao, '%Y%-%m') AND DATE_FORMAT(CURRENT_DATE(), '%Y%-%m') ;
Essa consulta me retorna todos os lançamentos dentro do período determinado por ano-mês
1) Dessa forma ela esta excluindo a saída caso alguma saída para mesReferencia coincida com planosclientes.dataInstalacao ou CURRENT_DATE()* Como fazer para incluir os extremos nesta consulta?
2) Outra coisa é que preciso listar, NÃO os valores de competência que estão lançados. Mas SIM os meses de competência que faltam para preencher todos os meses daquele intervalo.
Por isso estou tentando com php se não houver recurso com sql
Grato a quem puder ajudar!
Carlos Rocha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse exemplo funciona mais ou menos como você precisa. Você só precisará melhorá-lo pra fazer a verificação correta dos meses. Veja aqui o problema http://stackoverflow.com/questions/10724305/how-to-add-1-month-on-a-date-without-skipping-i-e-february#answer-10724354

 

<?php 


$mesesDb =  array(  
  '2014-01',
  '2014-03',
  '2014-06',
  '2014-07',
  '2014-11',
  '2014-12',
  '2015-01',
  '2015-02',
  '2015-03',
  '2015-04',
  '2015-07',
  '2015-09'
  );
$totalMeses = count($mesesDb);
$novosMeses = [];
for ($i=0; $i < $totalMeses ; $i++) :
$outroMes = strtotime ( '+1 month' , strtotime ( $mesesDb[$i] ) ) ;
$outroMes = date ( 'Y-m' , $outroMes);
if (!in_array($outroMes,$mesesDb)) {
# code...
// echo $mesParaTeste.'---';
array_push($novosMeses,$outroMes);
}
endfor ;
print_r($novosMeses);

Compartilhar este post


Link para o post
Compartilhar em outros sites

cheguei a isso:

Tenho esses 2 arrays
Array1
Array
(
    [0] => Array
        (
            [0] => 2015-02
            [1] => 8
        )
 
    [1] => Array
        (
            [0] => 2015-03
            [1] => 8
        )
 
    [2] => Array
        (
            [0] => 2015-04
            [1] => 8
        )
 
    [3] => Array
        (
            [0] => 2015-05
            [1] => 8
        )
 
    [4] => Array
        (
            [0] => 2015-06
            [1] => 8
        )
 
    [5] => Array
        (
            [0] => 2015-07
            [1] => 8
        )
 
    [6] => Array
        (
            [0] => 2015-08
            [1] => 8
        )
 
    [7] => Array
        (
            [0] => 2015-09
            [1] => 8
        )
 
)
e Array2
Array
(
    [0] => Array
        (
            [0] => 2015-02
            [1] => 8
        )
 
    [1] => Array
        (
            [0] => 2015-03
            [1] => 8
        )
 
    [2] => Array
        (
            [0] => 2015-04
            [1] => 8
        )
 
)
Preciso saber quais indices do Array2 já existem no array1 e excluir.
Como procedo?
usei array_diff conforme orientado acima e retornou vazio.

      //$result = array_diff($array2, $$array1);

      $result = array_diff($array1, $$array2);
 


 print "<pre>";
 print_r($result);
 print "</pre>";
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com base na sua primeira postagem...

<?php

$array = array(
     0 => "2014-01",
     1 => "2014-03",
     2 => "2014-06",
     3 => "2014-07",
     4 => "2014-11",
     5 => "2014-12",
     6 => "2015-01",
     7 => "2015-02",
     8 => "2015-03",
     9 => "2015-04",
     10 => "2015-07",
     11 => "2015-09"        
);

$dates = array( '2014-01', '2015-09', '2015-03' );

var_dump( array_diff( $array, $dates ) );

// resetando as chaves
var_dump( array_values( array_diff( $array, $dates ) ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por toda a dedicação. Mas esse código não trouxe o retorno esperado.,

 

Acabei criando uma função com estrutura primitiva mesmo e deu certinho!

 

 

<?php
function comparaArray($array1, $array2) { 
 
   $resultado = array();
   $contaArray = 0;
   $verifica = false;
 
   foreach ($array2 as $indice2) {
     foreach ($array1 as $indice1) {
  if($indice2[0] == $indice1[0] && $indice2[1] == $indice1[1]) {
$verifica = true;
break;
}
   }
 
   if ($verifica == false)
   { 
  $resultado[$contaArray][0] = $indice2[0];
  $resultado[$contaArray][1] = $indice2[1];
  $contaArray++;
   }   
   
   $verifica = false;
   
 }
 
 return $resultado;
 
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.