Usuário com melhor resposta
dias uteis x final de semana

Pergunta
-
Ola amigos
Precisamos de uma ajuda para o comando abaixo ( ajuda de amigos aqui), porem estamos tendo que alterar os dias para ficar correto:
Na linha dateadd(dd,-2, getdate()), 103)) precisamos que traga o dia de hoje -2 dias uteis, neste caso esta vindo o dia 07/10
ao inves do dia 06/10, como podemos resolver isso?
set dateformat dmy
; with cte as (
select tblwrirecepcao.PK_Recepcao, tblwrirecepcao.DtPrenotacao, tblwrititulos.DataUltimoRegistro,
tblWRIRecepcao.NumRPS
from tblwrirecepcao
inner join tblwrititulos on tblwrititulos.FK_tblWRIRecepcaoRecepcao = tblwrirecepcao.PK_Recepcao
where tblwrirecepcao.VlrTotCustas <> '0.00'
and ( tblwrititulos.DataUltimoRegistro =
set dateformat dmy
; with cte as (
select tblwrirecepcao.PK_Recepcao, tblwrirecepcao.DtPrenotacao, tblwrititulos.DataUltimoRegistro,
tblWRIRecepcao.NumRPS
from tblwrirecepcao
inner join tblwrititulos on tblwrititulos.FK_tblWRIRecepcaoRecepcao = tblwrirecepcao.PK_Recepcao
where tblwrirecepcao.VlrTotCustas <> '0.00'
and (tblwrititulos.DataUltimoRegistro = CONVERT(CHAR(10), dateadd(dd,-4,getdate()), 103))
and tblwrirecepcao.ValorTotal6 <> '0.00'
union
---------------------------------------CERTIDOES------------------------------------------------------
select tblwricertidao.Pk_NrPedido, tblWRICertidao.DataPedido, tblwricertidao.DataFinalRetirada,
tblwricertidao.NumRPS
from tblwricertidao
where (tblwricertidao.DataFinalRetirada = CONVERT(CHAR(10), dateadd(dd,-4,getdate()), 103))
--and tblwricertidao.NumRPS <> 0
and tblwricertidao.VlrTotCer6 <> 0
--order by tblwricertidao.Pk_NrPedido asc
union
---------------------------------------CANCELADOS-----------------------------------
select tblwrirecepcao.PK_Recepcao, tblwrirecepcao.DtPrenotacao, tblwrirecepcao.DtPrenotacao,
tblwrirecepcao.NumRPS
from tblwrirecepcao
where (tblwrirecepcao.DtCancelamento = CONVERT(CHAR(10), dateadd(dd,-4,getdate()), 103))
and tblwrirecepcao.ValorPrn6 <> '0.00'
and tblwrirecepcao.TipoPrenotacao <> 2
--and tblwrirecepcao.NumRPS is not null
--order by tblwrirecepcao.PK_Recepcao asc
union
-------------------------------------EXAME E CALCULO-----------------------------------
select tblwrirecepcao.PK_Recepcao, tblwrirecepcao.DtPrenotacao, tblwrirecepcao.DtPrenotacao,
tblwrirecepcao.NumRPS
from tblWRIRecepcao
inner join tblwrititulos on tblwrititulos.FK_tblWRIRecepcaoRecepcao = tblwrirecepcao.PK_Recepcao
where TipoPrenotacao =2
and (tblwrititulos.DtDevolucao >= CONVERT(CHAR(10), dateadd(dd,-4,getdate()), 103))
and tblwrirecepcao.NumRPS is not null
)
select PK_Recepcao, DtPrenotacao, DataUltimoRegistro,NumRPS from cte
where [dbo].[fn_VerificaDiaUtil](DataUltimoRegistro) = 1
order by NumRPS asc
and tblwrirecepcao.ValorTotal6 <> '0.00'
union
---------------------------------------CERTIDOES------------------------------------------------------
select tblwricertidao.Pk_NrPedido, tblWRICertidao.DataPedido, tblwricertidao.DataFinalRetirada,
tblwricertidao.NumRPS
from tblwricertidao
where (tblwricertidao.DataFinalRetirada = CONVERT(CHAR(10), dateadd(dd,-4,getdate()), 103))
--and tblwricertidao.NumRPS <> 0
and tblwricertidao.VlrTotCer6 <> 0
--order by tblwricertidao.Pk_NrPedido asc
union
---------------------------------------CANCELADOS-----------------------------------
select tblwrirecepcao.PK_Recepcao, tblwrirecepcao.DtPrenotacao, tblwrirecepcao.DtPrenotacao,
tblwrirecepcao.NumRPS
from tblwrirecepcao
where (tblwrirecepcao.DtCancelamento = CONVERT(CHAR(10), dateadd(dd,-4,getdate()), 103))
and tblwrirecepcao.ValorPrn6 <> '0.00'
and tblwrirecepcao.TipoPrenotacao <> 2
--and tblwrirecepcao.NumRPS is not null
--order by tblwrirecepcao.PK_Recepcao asc
union
-------------------------------------EXAME E CALCULO-----------------------------------
select tblwrirecepcao.PK_Recepcao, tblwrirecepcao.DtPrenotacao, tblwrirecepcao.DtPrenotacao,
tblwrirecepcao.NumRPS
from tblWRIRecepcao
inner join tblwrititulos on tblwrititulos.FK_tblWRIRecepcaoRecepcao = tblwrirecepcao.PK_Recepcao
where TipoPrenotacao =2
and (tblwrititulos.DtDevolucao >= CONVERT(CHAR(10), dateadd(dd,-4,getdate()), 103))
and tblwrirecepcao.NumRPS is not null
)
select PK_Recepcao, DtPrenotacao, DataUltimoRegistro,NumRPS from cte
where [dbo].[fn_VerificaDiaUtil](DataUltimoRegistro) = 1
order by NumRPS asc
Respostas
-
Tem um artigo que responde isso
https://social.technet.microsoft.com/wiki/pt-br/contents/articles/26290.adicionando-dias-uteis-usando-t-sql.aspx
Wesley Neves - Brasilia-DF
https://wesleyneves.wordpress.com/
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
Wesley Neves
- Marcado como Resposta Luis Padilha segunda-feira, 8 de janeiro de 2018 15:45
-
Da uma olhada se isso te ajuda , e ajudar e só colocar em uma function
DECLARE @dataInicio SMALLDATETIME = DATEADD(MONTH, -1, GETDATE()); DECLARE @dataTermino SMALLDATETIME = GETDATE(); DECLARE @DataParametro SMALLDATETIME = CONVERT(SMALLDATETIME, GETDATE(), 103); SELECT @DataParametro; ;WITH Datas AS (SELECT DATEADD(DAY, -5, @DataParametro) AS Data, DATEPART(WEEKDAY, DATEADD(DAY, -5, @DataParametro)) AS DiaSemana UNION ALL SELECT DATEADD(DAY, 1, D.Data), DATEPART(WEEKDAY, DATEADD(DAY, 1, D.Data)) AS DiaSemana FROM Datas D WHERE D.Data < DATEADD(DAY, 5, @DataParametro) ), Formatados AS (SELECT D.Data, D.DiaSemana, DiaSemanaExtenso = DATENAME(WEEKDAY, D.Data) FROM Datas D ) SELECT Formatados.Data, Formatados.DiaSemana, Formatados.DiaSemanaExtenso, DiaUtilAnterior = ( SELECT MAX(F.Data) FROM Formatados F WHERE F.DiaSemana NOT IN ( 7, 1 ) AND F.Data < @DataParametro ) FROM Formatados WHERE Formatados.Data = @DataParametro
Wesley Neves - Brasilia-DF
https://wesleyneves.wordpress.com/
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
Wesley Neves
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 11 de outubro de 2017 23:01
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 16 de outubro de 2017 13:13
Todas as Respostas
-
Tem um artigo que responde isso
https://social.technet.microsoft.com/wiki/pt-br/contents/articles/26290.adicionando-dias-uteis-usando-t-sql.aspx
Wesley Neves - Brasilia-DF
https://wesleyneves.wordpress.com/
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
Wesley Neves
- Marcado como Resposta Luis Padilha segunda-feira, 8 de janeiro de 2018 15:45
-
-
-
ALTER Function [dbo].[fn_VerificaDiaUtil]
(
@Data SmallDateTime
)
Returns Bit
Begin
Declare @FF Bit
Set @FF = 1
Set @Data = Convert(Varchar(10),@Data,103)
If DatePart(dw, @Data) = 1 Or
DatePart(dw, @Data) = 7
Set @FF = 0
Else Begin
If Exists ( Select tblWRIFeriados.Data From tblWRIFeriados Where tblWRIFeriados.Data=@Data )
Set @FF = 0
End
Return @FF
End
-
Tente utilizar a função abaixo para realizar o seu dateadd()
CREATE FUNCTION DATAVALIDA ( @TIPO VARCHAR, @QTDE INT, @DATA SMALLDATETIME ) RETURNS SMALLDATETIME AS BEGIN IF @QTDE = 0 RETURN @DATA SELECT @DATA = CASE @TIPO WHEN 'YY' THEN DATEADD(YY,@QTDE,@DATA) WHEN 'MM' THEN DATEADD(MM,@QTDE,@DATA) ELSE DATEADD(DD,@QTDE,@DATA) END IF @QTDE>0 SET @QTDE = 1 ELSE SET @QTDE = -1 WHILE DatePart(dw, @DATA) = 1 Or DatePart(dw, @DATA) = 7 OR Exists ( Select tblWRIFeriados.Data From tblWRIFeriados Where tblWRIFeriados.Data=@DATA ) BEGIN SET @DATA = DATEADD(DD,@QTDE,@DATA) END RETURN @DATA END GO
Eu tratei apenas considerando adição de dia, mês ou ano, pois não consegui encontrar uma forma de passar o datepart como parâmetro, porém acredito que deva existir algum jeito.
Exemplo de uso:
SELECT dbo.DATAVALIDA('DD',-2,CONVERT(date,'20171009')) --retorno - 2017-10-06 00:00:00 SELECT dbo.DATAVALIDA('DD',2,CONVERT(date,'20171006')) --retorno - 2017-10-09 00:00:00
Abraço!
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
- Editado Kanaãm Luz Romero Rodrigues segunda-feira, 9 de outubro de 2017 20:57
-
-
Da uma olhada se isso te ajuda , e ajudar e só colocar em uma function
DECLARE @dataInicio SMALLDATETIME = DATEADD(MONTH, -1, GETDATE()); DECLARE @dataTermino SMALLDATETIME = GETDATE(); DECLARE @DataParametro SMALLDATETIME = CONVERT(SMALLDATETIME, GETDATE(), 103); SELECT @DataParametro; ;WITH Datas AS (SELECT DATEADD(DAY, -5, @DataParametro) AS Data, DATEPART(WEEKDAY, DATEADD(DAY, -5, @DataParametro)) AS DiaSemana UNION ALL SELECT DATEADD(DAY, 1, D.Data), DATEPART(WEEKDAY, DATEADD(DAY, 1, D.Data)) AS DiaSemana FROM Datas D WHERE D.Data < DATEADD(DAY, 5, @DataParametro) ), Formatados AS (SELECT D.Data, D.DiaSemana, DiaSemanaExtenso = DATENAME(WEEKDAY, D.Data) FROM Datas D ) SELECT Formatados.Data, Formatados.DiaSemana, Formatados.DiaSemanaExtenso, DiaUtilAnterior = ( SELECT MAX(F.Data) FROM Formatados F WHERE F.DiaSemana NOT IN ( 7, 1 ) AND F.Data < @DataParametro ) FROM Formatados WHERE Formatados.Data = @DataParametro
Wesley Neves - Brasilia-DF
https://wesleyneves.wordpress.com/
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
Wesley Neves
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 11 de outubro de 2017 23:01
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 16 de outubro de 2017 13:13
-
Bom dia,
Por falta de retorno essa thread está encerrada.
Se necessário, favor abrir uma nova thread.
Atenciosamente,Filipe B de Castro
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.