Estou tentando obter o número de dias entre duas datas diferentes, exceto nos finais de semana.
Não sei como alcançar esse resultado.
postgresql
datetime
pragati basa
fonte
fonte
Respostas:
Supondo que por "fim de semana" você queira dizer sábado e domingo , isso pode ser ainda mais simples:
Você não precisa de um nível de subconsulta extra para
generate_series()
. SRF (funções de retorno de conjunto), também conhecidas como "funções de tabela", podem ser usadas como as tabelas daFROM
cláusula.Observe em particular que
generate_series()
inclui o limite superior na saída, desde que um intervalo completo (terceiro parâmetro) seja adequado. O limite superior será excluído apenas se o último intervalo for truncado, o que não acontece com dias inteiros.Com o padrão
ISODOW
para EXTRACT () , os domingos são relatados como7
, de acordo com o padrão ISO. Permite umaWHERE
condição mais simples .Em vez disso, ligue
generate_series()
com atimestamp
entrada. Aqui está o porquê:count(*)
é um pouco mais curto e mais rápido do quecount(the_day)
, fazendo o mesmo neste caso.Para excluir o limite inferior e / ou superior, adicione / subtraia 1 dia de acordo. Normalmente, você pode incluir o limite inferior e excluir o limite superior:
fonte
Este exemplo enumera todas as datas entre 15/12/2013 e 02-01-2014 (inclusive). A segunda coluna fornece o dia da semana (numericamente, entre 0 e 6). A terceira coluna marca se o dia da semana é um sábado / domingo ou não (você precisará adaptar o que considera um fim de semana) e é o que poderia ser usado para contar os dias da semana.
fonte
Supondo que um final de semana seja sábado e domingo, você pode usar o seguinte SQL.
Substitua as datas por suas escolhas e (0,6) pelos dias da semana que você deseja excluir.
Algumas coisas que você precisa observar: -
Você não mencionou qual versão do PostgreSQL você está executando. Isso funciona no 9.1+, mas deve funcionar nas versões inferiores.
As datas escolhidas são inclusivas ao usar generate_series. Então, se você quiser dias entre, adicione 1 dia para cada data.
fonte
Existem algumas coisas que você pode fazer para facilitar isso. O método que eu usaria seria garantir que uma tabela de datas estivesse disponível. Você pode criar rapidamente um assim:
Depois que a tabela for criada, você poderá preenchê-la com dados de data relativamente rapidamente.
Você pode escrever sua consulta como uma contagem rápida de registros desta tabela.
fonte
Eu sugiro que você crie uma função para uso sempre que quiser e escreva menos; )
Este código acima criará uma função sql que conta e retorna a quantidade de dias de final de semana (sábado, domingo). Da mesma maneira que você terá mais flexibilidade para usar esta função.
Depois disso, você pode usar a função para retornar apenas o número de dias do final de semana em um intervalo. Aqui está o exemplo a ser usado:
Essa seleção deve retornar quatro, porque o primeiro e o segundo dia são segunda-feira e temos dois sábados e dois domingos entre eles.
Agora, para retornar apenas dias úteis (sem fins de semana), como desejar , basta fazer uma subtração, como no exemplo abaixo:
fonte
fonte