Coletânea - Trabalhando com datas
Olá pessoal, estou atualmente fazendo um estágio que tem por principal aprender SQL Server 2008 e foi proposto um exercício que gostei de fazer mas muitas coisas pesquisei na net e não existia de maneira correta, então fiz da uma maneira que deu certo. O exercício era trabalhar com os finais de semana do ano mas acabou fazendo com todos os dias, e com as datas de muitas maneiras diferentes e a que encontrei mais dificuldade foi achar o último dia do mês, achei muitas coisas na net mas sempre bugava em fevereiro então fiz uma solução e gostaria de compartilhar com vocês.
CREATE PROCEDURE pr_exercicio_fds
@fds_anoinicio varchar(4),--RECEBE O VALOR DO EXEC
@fds_anofim varchar(4) --RECEBE O VALOR DO EXEC
AS
DECLARE @fds_count int, --CONTROLE NO LOOP
@fds_data date, --GERA AS DATAS NO LOOP
@fds_formatadata date, --FORMATAR A DATA PARA NÃO BUGAR O ULTIMO DIA
@fds_nomemes varchar(10), --NOME DO MÊS
@fds_ultimodiames varchar(2), --TRAZ O ULTIMO DIA DO MÊS
@fds_anomesdiainicio varchar(10), --MÊS E DIA INICIO
@fds_anomesdiafim varchar(10), --MÊS E DIA FINAL
@fds_dianome varchar(20), --NOME DO DIA
@fds_semananum varchar(10), --NÚMERO DA SEMENA
@fds_diaano varchar(10), --DIAS DO ANO
@fds_diasfinalano varchar(3) --DIAS ATÉ O FINAL DO ANO
CREATE TABLE #fds( --TABELA TEMPORÁRIA
fds_data date, --DIA, MÊS E ANO
fds_nomemes varchar(20), -- NOME DO MÊS
fds_ultimodiames varchar(2), --ÚLTIMO DIA DO MÊS
fds_dianome varchar(20), --NOME DO DIA DA SEMANA
fds_semananum varchar(10), --NÚMERO DA SEMANA
fds_diaano varchar(10), --NÚMERO DO DIA
fds_diasfinalano varchar(3) -- NÚMERO DE DIAS ATÉ O FINAL DO ANO
)
SET @fds_count = 0 --ZERA PARA NÃO ALTERAR A DATA ANTES DO LOOP
SET @fds_data = DATEADD(DAY, @fds_count, @fds_anoinicio) --SETA UM DATEADD QUE SERÁ ALTERADO NO LOOP
SET @fds_anomesdiainicio= @fds_anoinicio+'-01-01' --PEGA O ANO DIGITADO E SOMA O MÊS E O DIA INICIAL MANUALMENTE
SET @fds_anomesdiafim = @fds_anofim+'-12-31' --PEGA O ANO DIGITADO E SOMA O MÊS E O DIA FINAL MANUALMENTE
WHILE @fds_data < @fds_anomesdiafim --EM QUANTO A DATA QUE RECEBE O INCREMENTO FOR MENOR QUE A DATA FINAL
BEGIN
SET @fds_data = DATEADD(DAY, @fds_count, CONVERT(date, @fds_anomesdiainicio)) --FAZ O INCREMENTO NO DIA PELO CONTADOR E CONVERTE A @fds_anomesdiainicio PARA DATE
SET @fds_count = @fds_count + 1 --CONTADOR PARA INCREMENTEAR A DATA
IF DATEPART(DW, @fds_data) IN (1, 2, 3, 4, 5, 6, 7) --USANDO O DATEPART COM DW (DAY WEEK / DIA DA SEMANA)
BEGIN
--MONTA A DATA SOMENTE COM O PRIMEIRO DIA DO MÊS E DA UM RIGHT DE DUAS POSIÇÕES PARA PEGAR SOMENTE O DIA
SET @fds_formatadata = CONVERT(varchar(4), YEAR(@fds_data)) + '-' + RIGHT('0'+CONVERT(varchar(2), MONTH(@fds_data)), 2) + '-01'
/*ADICIONA UM MÊS E SUBTRAI UM DIA PARA PEGAR O ÚLTIMO DIA DO MÊS EM QUE ESTAVA.
EX: TEMOS A DATA 2014-01-01 SE SUBTRAIRMOS 1 DIA A DATA IRÁ PARA 2013-12-31
ENTÃO ANTES DE SUBTRAIR O DIA ACRESCENTO UM MÊS ENTÃO A DATA FICA 2014-02-01
E SUBTRAIO 1 DIA E A DATA VOLTA PARA 2014-01-31 RESULTANDO ASSIM NO ÚLTIMO DIA DO MÊS.
ASSIM NÃO TERÁ PROBLEMAS COM FEVEREIRO MESMO EM ANOS BIS---TOS NEM COM AGOSTO*/
SET @fds_ultimodiames = RIGHT(CONVERT(varchar(10), DATEADD(D, -1, DATEADD(M, 1, @fds_formatadata))), 2)
--FAZ A DIFERENÇA DA DATA EM QUE ESTÁ COM A DATA FINAL PARA CALCULAR QUANTOS DIAS FALTAM ATÉ O FINAL DO ANO
SET @fds_diasfinalano = DATEDIFF(D, @fds_data, @fds_anomesdiafim)
--USA O DATEPART COM WK (WEEK / SEMANA) PARA NUMERAR EM QUE SEMANA ESTÁ
SET @fds_semananum = DATEPART(WK, @fds_data)
--USA O DATEPART COM DY (DAY YEAR / DIA ANO) PARA NUMERAR EM QUE DIA DO ANO ESTÁ
SET @fds_diaano = DATEPART(DY, @fds_data)
--USA O DATENAME COM DW (DAY WEEK / DIA SEMANA) PARA NOMEAR EM QUE DIA DA SEMANA ESTÁ
SET @fds_dianome = DATENAME(DW, @fds_data)
--USA O DATENAME COM MM (MONTH / MÊS) PARA NOMEAR EM QUE MÊS ESTÁ
SET @fds_nomemes = DATENAME(MM, @fds_data)
INSERT INTO #fds --INSERE NA TABELA TEMPORÁRIA
(fds_data, fds_nomemes, fds_ultimodiames, fds_dianome, fds_semananum, fds_diaano, fds_diasfinalano)
VALUES (@fds_data, @fds_nomemes, @fds_ultimodiames, @fds_dianome, @fds_semananum, @fds_diaano, @fds_diasfinalano)
END
END
--FAZ O SELECT DA TABELA COMPLETA
SELECT *
FROM #fds
GO
EXEC [pr_exercicio_fds] '2014', '2014'
Discussão (2)
Carregando comentários...