Incrementar intervalo de datas

30/11/2012

0

Boa noite a todos,

Sou novo no site e estou com a seguinte situação, tenho uma tabela chamada AFASTAMENTOS (FUNC, DATAI, DATAF) EX: SELECT * FROM AFASTAMENTOS RESULTADO:

FUNC / DATAI / DATAF
000005, 20120808, 20120810
000056, 20120804, 20120807

Estou precisando preencher o intervalo de datas conforme o segue abaixo:

FUNC / DATAI / DATAF
000005, 20120808, 20120810
000005, 20120809, 20120810
000005, 20120810, 20120810
000056, 20120804, 20120807
000056, 20120805, 20120807
000056, 20120806, 20120807
000056, 20120807, 20120807

SEGUE TQUERY ABAIXO:

DECLARE C_CODIGO CURSOR
LOCAL
FAST_FORWARD
FOR SELECT FUNC FROM AFASTAMENTOS

DECLARE @FUNC VARCHAR (12)
DECLARE @CONTADOR INT
DECLARE @CONT INT
DECLARE @DATA DATETIME
DECLARE @DATAI DATETIME
DECLARE @DATAF DATETIME

OPEN C_CODIGO
-- EXIBIR 5 LINHAS DA CONSULTA
SET @CONTADOR = 1
WHILE @CONTADOR <= 1--(SELECT COUNT(FUNC )FROM AFASTAMENTOS)
BEGIN
FETCH C_CODIGO INTO @FUNC
SET @CONTADOR = @CONTADOR + 1
BEGIN
SET @DATAI = (SELECT DATAI FROM AFASTAMENTOS WITH (NOLOCK) where FUNC=@FUNC)
SET @DATAF = (SELECT DATAF FROM AFASTAMENTOS WITH (NOLOCK) where FUNC=@FUNC)
WHILE @DATAI <= @DATAF

INSERT INTO AFASTAMENTO (FUNC, DATA)
SELECT
@FUNC,
@DATAI
SET @DATAI = @DATAI + 1
END
END

CLOSE C_CODIGO
DEALLOCATE C_CODIGO

COMO RESOLVER ?

DESDE JÁ AGRADEÇO


Fábio Vieira

Fábio Vieira

Responder

Posts

30/11/2012

Alex Lekao

Ola Boa tarde!!!

Desculpe mas eu nao consegui entender muito bem o seu codigo.

Vc criou um cursor para fazer o registro dia a dia do afastamento? vc precisa realmente que apareca dia a dia?

eu recomendaria vc usar o Datediff que ele vai mostrar a diferenca entre as duas datas, ficaria mais leve e rapido o codigo e acredito que atingiria o mesmo objetico(embora eu nao saiba o objetivo exato... rsrs).

Espero ter ajudado.

Abraco.

Alex - Lekao
Responder

01/12/2012

Daniel Costa

O incremento da data pode ser feito assim

set @DATAI = convert(varchar,dateadd(d,1,convert(datetime,@DATAI,112)),112)


Mas usar DateDiff realmente seria melhor
Responder

04/12/2012

Fábio Vieira

Preciso preencher as data da inicio ao fim exemplo: matricula = 000254, dataini = '20121001', datafim = '20121003',
preciso do seguinte resultado
matricula = 000254, data = '20121001'
matricula = 000254, data = '20121002'
matricula = 000254, data = '20121003'

Consegui da seguinte forma:

DECLARE C_CODIGO CURSOR
LOCAL
FAST_FORWARD
FOR SELECT FUNC FROM AFASTAMENTOS

DECLARE @FUNC VARCHAR (12)
DECLARE @CONTADOR INT
DECLARE @CONT INT
DECLARE @DATA DATETIME
DECLARE @DATAI DATETIME
DECLARE @DATAF DATETIME

OPEN C_CODIGO
-- EXIBIR 5 LINHAS DA CONSULTA
SET @CONTADOR = 1
FETCH C_CODIGO INTO @FUNC
WHILE @CONTADOR <= 1--(SELECT COUNT(FUNC )FROM AFASTAMENTOS)
BEGIN
--
--FETCH C_CODIGO INTO @FUNC

SET @CONTADOR = @CONTADOR + 1
BEGIN
SET @DATAI = (SELECT DATAI FROM AFASTAMENTOS WITH (NOLOCK) where FUNC=@FUNC)
WHILE @DATAI <= (SELECT DATAF FROM AFASTAMENTOS WITH (NOLOCK) where FUNC=@FUNC)
BEGIN
SET @DATA = @DATAI + 1
END
BEGIN
INSERT INTO AFASTAMENTO (FUNC, DATA)
SELECT @FUNC, @DATA
END
END
END

CLOSE C_CODIGO
DEALLOCATE C_CODIGO

--SELECT * FROM AFASTAMENTO
Responder

05/12/2012

Alex Lekao

Ola Bom dia!!!

Se resolveu o problema, maravilha!!!

Acredito que tbm conseguiria resolver com CTE ou alguma View, talvez ate ficasse um pouco mais rapido.

Mas no caso o importante eh atender a necessidade depois ve possibilidade de ajustes nao eh verdade? rsrsr

Bom $UCE$$O para vc.

Abraco.

Alex - Lekao
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar