Incrementar intervalo de datas
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
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
Curtidas 0
Respostas
Alex Lekao
30/11/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
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
GOSTEI 0
Daniel Costa
30/11/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
set @DATAI = convert(varchar,dateadd(d,1,convert(datetime,@DATAI,112)),112)
Mas usar DateDiff realmente seria melhor
GOSTEI 0
Fábio Vieira
30/11/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
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
GOSTEI 0
Alex Lekao
30/11/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
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
GOSTEI 0