Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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.
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')Funcionou.
Obrigado
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.