Ir para conteúdo

POWERED BY:

Arquivado

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

VINICIUS RAMOS

[Resolvido] Função para retornar dias da semana em um determinado

Recommended Posts

Amigos, boa tarde

 

Preciso de uma função que me retorne todas as primeiras quartas_feiras de um determinado intervalo de datas.

 

Alguém pode me ajudar?

 

Para as últimas quartas feiras consegui bolar uma função mas com as primeiras fiquei confuso.

 

when 23 -- Últimas quartas-feiras de cada mês exceto as de março e setembro

then (datediff(mm, @inicio, @fim) -- Quantidade de meses

- case month(dateadd(dd,(11-datepart(dw,@inicio))%7,@inicio))

when month(@inicio) then 0 else 1 end -- subtrai se inicio após ultima 4ª Feira

+ case month(dateadd(dd,((10-datepart(dw,@fim))%7)+1,@fim))

when month(@fim) then 0 else 1 end -- adiciona se não tem outra 4ª Feira após fim

-- subtrai se inicio após última quarta de Março ou Setembro

- (((Year(@fim) * 2) + case when month(@fim) < 7 then 0 else 1 end)

- ((Year(@inicio) * 2) + case when month(@inicio) < 7 then 0 else 1 end) -- Quantidade de Semestres

- case when (month(dateadd(dd,(11-datepart(dw,@inicio))%7,@inicio)) > month(@inicio)

and month(@inicio) % 6 = 3) or ((month(@inicio) - 1) % 6 > 2)

then 1 else 0 end -- subtrai se inicio após última quarta de Março ou Setembro

+ case when (month(dateadd(dd,((10-datepart(dw,@fim))%7)+1,@fim)) > month(@fim)

and month(@fim) % 6 = 3) or ((month(@fim) - 1) % 6 > 2)

then 1 else 0 end))-- adiciona se fim após ou na última quarta de Março ou Setembro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode detalhar mais essa sua função...

 

O parametro da função será um intervalo de datas?

Todas as primeiras quartas-feiras, seria a primeira quarta-feira de cada mês?

 

Passa um exemplo de chamada e retorno dessa função.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, o parametro da função será um intervalo de datas.

 

Seguem alguns exemplos

 

Exemplo1:

data_inicio = '20100101'

data_fim = '20100105'

O resultado será zero pois a primeira quarta feira de 2010 caiu no dia 06.

 

Exemplo2:

data_inicio = '20100101'

data_fim = '20100120'

O resultado será um pois a primeira quarta feira de 2010 já passou.

 

Exemplo3:

data_inicio = '20100101'

data_fim = '20100510'

O resultado será cinco pois tivemos cinco quartas-feiras em meses diferentes.

 

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uma função que retorna o que você quer. Faça mais testes para ver se tem algum caso que ela não trata.

 

CREATE function fncPrimeiras_Quartas(@Data_Inicial datetime, @Data_Final datetime)

Returns int

AS

BEGIN

 

--declare @Data_Inicial datetime, @Data_Final datetime --testes

--select @Data_Inicial = '20100108', @Data_Final= '20100510'

 

declare @Dt_Aux datetime, @Result int

declare @quartas table(Cod int identity(1,1), Quarta datetime)

 

 

set @Dt_Aux = @Data_Inicial

 

 

while @Dt_Aux <= @Data_Final

begin

if datepart(dw,@Dt_Aux) = 4

insert into @quartas(Quarta)

values(@Dt_Aux)

 

set @Dt_Aux = @Dt_Aux + 1

end

 

/* --lista todas as primeiras quartas de cada mes

select MONTH(quarta), MIN(quarta)

from @quartas

group by MONTH(quarta)

having daY(MIN(quarta)) <= 7

*/

 

select @Result = SUM(registros)

from (

select 1 registros

from @quartas

group by MONTH(quarta)

having daY(MIN(quarta)) <= 7 )A

 

return isnull(@Result,0)

END

 

select dbo.fncPrimeiras_Quartas('20100101','20100105')

 

select dbo.fncPrimeiras_Quartas('20100101','20100120')

 

select dbo.fncPrimeiras_Quartas('20100101','20100510')

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.