Ir para conteúdo

Arquivado

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

yuringolfeto

Coletânea - Trabalhando com datas

Recommended Posts

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'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tenho um post que exemplifica calculos, incluindo finais de semana, caso ainda precise.

http://adjuniordba.wordpress.com/2014/01/30/calculo-simples-de-data/

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá yuringolfeto,

 

Parabéns pela sua atitude em postar uma solução que você encontrou.

 

Na maioria das vezes (me incluo nisso também) a gente acaba vindo aqui somente para perguntar.

 

Grande abraço!

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.