none
dias uteis x final de semana RRS feed

  • 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

    segunda-feira, 9 de outubro de 2017 15:04

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
    segunda-feira, 9 de outubro de 2017 16:36
  • 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

    segunda-feira, 9 de outubro de 2017 20:29

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
    segunda-feira, 9 de outubro de 2017 16:36
  • Nao deu certo no meu caso
    segunda-feira, 9 de outubro de 2017 16:45
  • Poste o conteúdo da sua function "[dbo].[fn_VerificaDiaUtil]".

    Douglas Moura | Cuiabá-MT

    segunda-feira, 9 de outubro de 2017 17:17
  • 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

    segunda-feira, 9 de outubro de 2017 18:22
  • 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


    segunda-feira, 9 de outubro de 2017 19:38
  • O meu select inicial ficaria da mesma forma?

    segunda-feira, 9 de outubro de 2017 20:07
  • 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

    segunda-feira, 9 de outubro de 2017 20:29
  • 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.

    segunda-feira, 16 de outubro de 2017 13:13
    Moderador