Array
(
)

Incrementar intervalo de datas

Fábio Vieira
   - 30 nov 2012

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

Alex Lekao
   - 30 nov 2012

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

Daniel Costa
   - 01 dez 2012

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

Fábio Vieira
   - 04 dez 2012

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

Alex Lekao
   - 05 dez 2012

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