Fórum Consulta Sql que liste do 1º ao último dia do mes atual #470036

14/02/2014

0

Olá,

Eu consigo buscar o primeiro e o último dia do mes atual dessa maneira:

SELECT DATEADD(1 - EXTRACT(DAY FROM CURRENT_DATE) DAY TO CURRENT_DATE ) first_day FROM RDB$DATABASE
UNION
SELECT DATEADD(-EXTRACT(DAY FROM DATEADD(1 MONTH TO CURRENT_DATE )) DAY TO DATEADD(1 MONTH TO CURRENT_DATE)) last_day FROM RDB$DATABASE

Result:
01/02/2014
28/02/2014

Mas eu gostaria que fosse listado também os demais dias do mes atual (2,3,4,5...27)

Qualquer ajuda será bem vinda.

Abraço.

Leandro
Leandro Medeiros

Leandro Medeiros

Responder

Posts

14/02/2014

Alex Lekao

Oi Leandro, boa tarde!!

Eu nao entendi, vc quer montar em ordem, como se fosse uma coluna com as datas do dia 01 ate 28?

Ou vc quer que em coluna aparecem do dia 01 ao 28, no caso seriam 28 colunas?

Nao sei se o Firebird tem isso, mas no sql server normalmente usa-se CTS que ou uma funcao para fazer essa situacao.

No caso de colunas no firebird se nao me engano nao faz pivot, e com a CTS vc conseguiria montar o Pivot e exibir o resultado que apresentaria em linhas como colunas.

Abraco.

Alex - Lekao
Responder

Gostei + 0

14/02/2014

Marisiana Battistella

Pelo que entendi ele só quer que liste todos os dias do mês atual.
Estava pesquisando pra ver se tem alguma função que faz isso mas não encontrei nada ainda....
Responder

Gostei + 0

14/02/2014

Leandro Medeiros

Olá Alex,

Obrigado pela resposta ;D.

O que eu quero é fazer um Left Join do resultado dessa consulta com a tabela de faturamento, assim eu saberei quais dias não teve vendas no mes atual.

Eu sei que no SQL Server isso é possível porque eu já fiz.

Então, para exemplificar melhor, posso desenhar melhor o problema assim:

Resultado da query dos dias do mes:
01/02/2014
02/02/2014
03/02/2014
...
28/02/2014

left join tabela de faturamento....

resultado final

01/02/2014 R$ 100,00
02/02/2014 R$ 0,00
03/02/2014 R$ 500,00
...assim por diante.

Você ainda não viu algo parecido no firebird?

Obrigado.

Leandro

Responder

Gostei + 0

17/02/2014

Alex Lekao

Oi Leandro, bom dia!!!

Desculpe a demora.

DEixa eu ver se entendi, vc tem uma tabela com todos os dias do mes, seguencialmente sem furos, e quer fazer o join desta tabela com a tabela de faturamento sua?

Eles tem algum campo em comum que a gente possa usar com referencia/ link entre eles?

Se tiver, teriamos que usa-lo para fazer o join.

Agora se for somente as datas acredito que tera que ser feito algum "recurso tecnico" para trazer do jeito que vc precisa, possivelmente uma subselect.

Me desculpe nao ajudar mais, mas para mim ainda ficou meio vago.

TAlves com as estruturas das tabelas consigamos ajudar melhor.

Abraco.

Alex - Lekao
Responder

Gostei + 0

17/02/2014

Leandro Medeiros

Olá Alex,

Não é exatamente isso ...

Como eu havia postado anteriormente, essa é a consulta que eu consegui fazer:

SELECT DATEADD(1 - EXTRACT(DAY FROM CURRENT_DATE) DAY TO CURRENT_DATE ) first_day FROM RDB$DATABASE
UNION
SELECT DATEADD(-EXTRACT(DAY FROM DATEADD(1 MONTH TO CURRENT_DATE )) DAY TO DATEADD(1 MONTH TO CURRENT_DATE)) last_day FROM RDB$DATABASE

Result:
01/02/2014
28/02/2014

Eu preciso além dessas duas datas (1º dia do mês e último dia do mês atual) os demais dias do mês atual, então o resultado da minha consulta teria de ficar assim:
Result:
01/02/2014
02/02/2014
03/02/2014
...
28/02/2014

Como vc pode ver, é simplesmente uma query que liste todos os dias do mês a partir de RDB$DATABASE .

Abraço.
Responder

Gostei + 0

17/02/2014

Marisiana Battistella

Existe uma função que retorna o primeiro dia do mês, outra que retorna o último dia do mês e o que ele precisaria é de uma função que retorne todos os dias do mês.
Conhece alguma, Alex?
Estava pesquisando pra ver se existe alguma função que faz isso, infelizmente não consegui encontrar nada que possa ajudar.
Se alguém tiver alguma alternativa para apresentar, também tenho interesse em saber...
Responder

Gostei + 0

17/02/2014

Alex Lekao

Oi Marisiana,

Em firebird ainda nao encontrei, ja vi esse tipo de duvida no forum, bem similar, com outras particularidades, e nao tinha.

Ja vi funcoes para fazer algo parecido com SQL Server, usando CTS.

Talvez de para fazer usando while, mas meu conhecimento eh muito limitado para tanto. rsrsr

Eu ate tenho um banco firebird aqui, mas nao tenho ideia de como montar.

Infelizmente vou ficar devendo essa. =/

Abraco.

Alex - Lekao
Responder

Gostei + 0

17/02/2014

Marisiana Battistella

Pois é ... tá complicado isso...
Obrigada pela ajuda! =)
Responder

Gostei + 0

17/02/2014

Alex Lekao

Ja pesquisei bastante e nao achei.

Eu acredito que se for possivel usar o While no firebird na montagem do codigo acho que atenda.

Mas se precisar de alguma coisa, eh so falar, estou sempre aqui e a disposicao.

Embora acredite que eu va ajudar bem poquinho pelo nivel de conhecimento que tenho. rsrsr

Abraco.

Alex - Lekao
Responder

Gostei + 0

17/02/2014

Leandro Medeiros

Caramba dev masters!

Achei que essa ia ser facil para vcs ;D.

Eu vou conseguir fazer isso, aguardem....
Responder

Gostei + 0

17/02/2014

Marisiana Battistella

Ainda não sou dev master! \0/ hehehehehe....
Se descobrir como se faz compartilha conosco, por gentileza!
Responder

Gostei + 0

18/02/2014

Alex Lekao

OI Bom dia!!!

Eu to longe de ser um.... rsrsr

Mas conseguindo posta ae para conhecimento da galera.

Abraco.

Alex - Lekao
Responder

Gostei + 0

18/02/2014

Deivison Melo

Dá uma olhada nesse post, pode ser que ajude!!

[url]https://www.devmedia.com.br/forum/criar-view-para-saber-todas-as-segundas-e-tercas-do-ano/455952[/url]

Abração e bons códigos
Responder

Gostei + 0

24/02/2014

Marisiana Battistella

Achei!!!
Não sei se tem essa função no Firebird, não tenho ele instalado pra testar...
Mas, no PostgreSQL temos a função generate_series que retorna os dias entre duas datas, com o intervalo especificado.

Para obter os dias do mês atual:
  SELECT * 
  FROM generate_series(date_trunc('month',current_date), 
                      date_trunc('month',current_date) + INTERVAL'1 month' - INTERVAL'1 day',
                      INTERVAL'1 day');

Ou:
     SELECT * 
    FROM generate_series(DATE'2012-12-01',DATE'2012-12-31',INTERVAL'1 day');
 
Responder

Gostei + 0

25/02/2014

Leandro Medeiros

Esse código retorna todos os dias do mes atual, agora tem que terminar para funcionar do jeito que preciso, mas já é um começo.

set term ^ ;
EXECUTE BLOCK
RETURNS (
  D DATE
)
AS
DECLARE VARIABLE DATAI DATE;
DECLARE VARIABLE DATAF DATE;
BEGIN
     DATAI = (SELECT DATEADD(1 - EXTRACT(DAY FROM CURRENT_DATE) DAY TO CURRENT_DATE ) FROM RDB$DATABASE);
     DATAF = (SELECT DATEADD(-EXTRACT(DAY FROM DATEADD(1 MONTH TO CURRENT_DATE )) DAY TO DATEADD(1 MONTH TO CURRENT_DATE)) FROM RDB$DATABASE);
     D = DATAI;

     WHILE (D <= DATAF) DO
       BEGIN
         --COLOCAR O SELECT AQUI
         SUSPEND;

         D = D + 1;
       END
END^
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar