Consulta Sql que liste do 1º ao último dia do mes atual

Firebird

14/02/2014

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

Curtidas 0

Respostas

Alex Lekao

Alex Lekao

14/02/2014

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
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

14/02/2014

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....
GOSTEI 0
Leandro Medeiros

Leandro Medeiros

14/02/2014

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

GOSTEI 0
Alex Lekao

Alex Lekao

14/02/2014

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
GOSTEI 0
Leandro Medeiros

Leandro Medeiros

14/02/2014

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.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

14/02/2014

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...
GOSTEI 0
Alex Lekao

Alex Lekao

14/02/2014

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
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

14/02/2014

Pois é ... tá complicado isso...
Obrigada pela ajuda! =)
GOSTEI 0
Alex Lekao

Alex Lekao

14/02/2014

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
GOSTEI 0
Leandro Medeiros

Leandro Medeiros

14/02/2014

Caramba dev masters!

Achei que essa ia ser facil para vcs ;D.

Eu vou conseguir fazer isso, aguardem....
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

14/02/2014

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

Alex Lekao

14/02/2014

OI Bom dia!!!

Eu to longe de ser um.... rsrsr

Mas conseguindo posta ae para conhecimento da galera.

Abraco.

Alex - Lekao
GOSTEI 0
Deivison Melo

Deivison Melo

14/02/2014

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
GOSTEI 0
Deivison Melo

Deivison Melo

14/02/2014

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
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

14/02/2014

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');
 
GOSTEI 0
Leandro Medeiros

Leandro Medeiros

14/02/2014

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^
GOSTEI 0
Alex Lekao

Alex Lekao

14/02/2014

Blz...

eh isso ae...

se nao me engano esse codigo eh de uma procedure.

Acredito que essa seria mesmo umas das formas de fazer.

Boa sorte.

Conseguindo finalizar, posta ai para ajudar alquem que possa ter o mesmo problema.

Abraco.

Alex - Lekao
GOSTEI 0
Nicolas Paulino

Nicolas Paulino

14/02/2014

Para trazer o ultimo dia do mês atual no Firebird 1.5 utilizando UDF:

SELECT
CAST(UDF_MONTHEND(UDF_YEAR(CURRENT_DATE),UDF_MONTH(UDF_INCMONTH(CURRENT_DATE,1))) AS DATE)
FROM
RDB$DATABASE
GOSTEI 0
POSTAR