none
Dias Úteis RRS feed

  • Pergunta

  • Srs.
    Boa tarde,

    Estou com problema de dias úteis.
    Tenho 2 campos na tabela:
    - Data de Chegada
    - Data de Saída

    So que a subtração desses campos, por exemplo, o valor é 47:21 horas.
    Mas vcs concordam que a pessoas não demorou tanto tempo para executar o serviço.
    O dia de trabalho tem 8 horas e não 24 horas como esta calculando.

    O que estou precisando executar é dias úteis e não estou conseguindo
    O horário ak onde trabalho é loco:
    - De segunda e sexta-feira, o horário de entrada é 07h15 e saída 16h15
    - De terça, Quarta e Quinta-feira, o horário é  09h00 e saída 18h00
    - Sabado, o horário é 08h00 e saida é 17h00

    Não podendo esquecer q não posso somar feriados

    Obrigado pela ajuda!
    Ricardo Freitas

    segunda-feira, 18 de março de 2013 19:04

Todas as Respostas

  • Ricardo, boa noite

    Para o caso de sábados e domingos, o SQL possui funções que é possível identificar e excluir estes dias do seu cálculo. Caso a pessoa faça hora-extra em um fim de semana, é possível isolar e fazer o tratamento diferentemente do restante.

    Acho feriado, não tem jeito! Vc precisa ter uma tabela auxiliar que esteja cadastrada todos os feriados nacionais, estaduais e municipais de acordo com sua região.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    • Sugerido como Resposta Roberson Naves segunda-feira, 18 de março de 2013 22:49
    • Marcado como Resposta Felipo Gonçalves terça-feira, 19 de março de 2013 11:55
    • Não Marcado como Resposta RicardoFFreitas terça-feira, 19 de março de 2013 16:24
    • Não Sugerido como Resposta RicardoFFreitas terça-feira, 19 de março de 2013 17:47
    segunda-feira, 18 de março de 2013 22:08
  • Eduardo

    Bom dia,
    Obrigado pelo retorno!

    A tabela de feriado eu tenho!
    Agora, como faço essa function ou query para trazer esses resultados!
    Estou quebrando a cabeça e não sai nada!

    Obrigado mais uma vez

    Ricardo Freitas

    terça-feira, 19 de março de 2013 13:20
  • Ricardo, boa tarde.

    Crie uma função que receba um parâmetro dia e que tenha uma saída do tipo boolean. (True se é feriado ou fim de semana ou False para dias comuns).

    Após isto a sua função terá duas linhas de código, a primeira fazendo o select da data em sua tabela de feriados, se encontrar saia da função retornando true, se não encontrar aplique a seguite função:

    declare @data datetime2
    
    set @data = '20130316'
    
    if DATEPART(WEEKDAY, @data) in (7,1) --Sábado ou domingo
    	print 'Fim de semana'
    

    Abs.

    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    terça-feira, 19 de março de 2013 18:19
  • Ricardo,

    Veja este exemplo:

    Set DateFormat dmy
    
    Declare @DiaFinal Int,
               @ContarDias Int
    
    Set @DiaFinal = (Select DatePart(Day,GetDate()))
    Set @ContarDias=0
    
    Set Datefirst 1
    
    While @DiaFinal >= (Select DatePart(Day,GetDate())) And @DiaFinal < 28
     Begin
      Set @ContarDias = @ContarDias + 1
      Set @DiaFinal=(Select DatePart(Day,GetDate()+@ContarDias))
     End
    
    SELECT @@DATEFIRST AS '1st Day',  DATEPART(dw,GetDate()+@ContarDias) AS 'Today', @ContarDias As "Total de Dias"
    
    
    

    Em relação aos feriados, eu montei a algum tempo um calendário anual e nele eu indico se o dia é útil ou não.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 20 de março de 2013 17:57
  • De uma olhada nessas duas funções, já fiz algo desse tipo no sql server 2008 r2

    CREATE FUNCTION [dbo].[DATA_SEGUINTE](@DATA_IN DATE)
    RETURNS DATE
    	BEGIN
    
    		DECLARE
    			@VALIDA_FERIADO_FDS INT,
    			@DIA_SEMANA INT
    
    --Inicializa a variavel para correr no loop
    		SET @VALIDA_FERIADO_FDS = 1
    
    		WHILE @VALIDA_FERIADO_FDS > 0
    			BEGIN
    				SELECT @DATA_IN = DATEADD(DAY,1,@DATA_IN)	
    				SELECT @DIA_SEMANA = DATEPART(DW,@DATA_IN)
    --Verifica o dia da semana na variável @DIA_SEMANA. 
    -- 1 = Domingo; 2 = Segunda; 3 = Terça; 4 = Quarta; 5 = Quinta; 6 = Sexta; 7 = Sábado; 
    --Para ocorrer nesta forma o sistema tem que estar com SET DATEFIRST 7
    				IF @DIA_SEMANA = 7
    					BEGIN
    						SELECT @DATA_IN = DATEADD(DAY,2,@DATA_IN)	
    					END
    				IF @DIA_SEMANA = 1
    					BEGIN
    						SELECT @DATA_IN = DATEADD(DAY,1,@DATA_IN)	
    					END
    --Procura por feriado, caso o dia adicionado seja um fériado
    				SELECT @VALIDA_FERIADO_FDS = COUNT(*)
    				FROM DBINTECH.DBO.TB_FERIADO
    				WHERE CONVERT(DATE,DT_FERIADO) = @DATA_IN
    			END
    
    			RETURN(@DATA_IN)
      
    	END
    
    GO

    CREATE FUNCTION [dbo].[DATA_REFERENCIA](@DATA_IN DATE)
    RETURNS CHAR(10)
    AS
    BEGIN
    	DECLARE 
    		@DATA_OUT CHAR(10),
    		@DIA INT,
    		@MES INT,
    		@ANO INT,
    		@DIA_SEMANA INT,
    		@VALIDA_FERIADO INT
    		SET @VALIDA_FERIADO = 1
    
    SET @MES = DATEPART(MONTH,@DATA_IN)
    SET @ANO = DATEPART(YEAR,@DATA_IN)
    
    IF @ANO = 2009 AND @MES = 11
    	BEGIN
    		SET @DATA_OUT = '2009/11/03'
    	END
    ELSE
    	BEGIN
    		IF @MES = 1
    			BEGIN
    				SET @MES = @MES + 11
    				SET @ANO = @ANO - 1
    			END
    		ELSE
    			BEGIN
    				SET @MES = @MES - 1
    			END
    	--Verifica se o ano é bissexto, para especificar o ultimo dia do mês
    		IF (@ANO % 4 = 0 AND @ANO % 100 != 0) OR (@ANO % 400 = 0)
    			BEGIN
    				SELECT @DIA = CASE @MES
    												WHEN 1 THEN 31
    												WHEN 2 THEN 29
    												WHEN 3 THEN 31
    												WHEN 4 THEN 30
    												WHEN 5 THEN 31
    												WHEN 6 THEN 30
    												WHEN 7 THEN 31
    												WHEN 8 THEN 31
    												WHEN 9 THEN 30
    												WHEN 10 THEN 31
    												WHEN 11 THEN 30
    												WHEN 12 THEN 31
    											END
    			END
    		ELSE
    			BEGIN
    				SELECT @DIA = CASE @MES
    												WHEN 1 THEN 31
    												WHEN 2 THEN 28
    												WHEN 3 THEN 31
    												WHEN 4 THEN 30
    												WHEN 5 THEN 31
    												WHEN 6 THEN 30
    												WHEN 7 THEN 31
    												WHEN 8 THEN 31
    												WHEN 9 THEN 30
    												WHEN 10 THEN 31
    												WHEN 11 THEN 30
    												WHEN 12 THEN 31
    											END
    			END
    				
    				SET @DATA_OUT = CAST(@ANO AS CHAR(4)) + '/' +  CAST(@MES AS CHAR(2)) + '/' + CAST(@DIA AS CHAR(2))
    				
    		WHILE @VALIDA_FERIADO > 0
    			BEGIN		
    	--Verifica se é feriado. A váriavel recebe 0 para ausencia de feriado e =! 0 para feriado presente.
    				SELECT @VALIDA_FERIADO = COUNT(*)
    				FROM DBINTECH.DBO.TB_FERIADO
    				WHERE CONVERT(DATE,DT_FERIADO) = @DATA_OUT
    					IF @VALIDA_FERIADO != 0
    						BEGIN
    							SET @DIA = @DIA - 1
    							SET @DATA_OUT = NULL
    						END
    				
    					SET @DATA_OUT = CAST(@ANO AS CHAR(4)) + '/' +  CAST(@MES AS CHAR(2)) + '/' + CAST(@DIA AS CHAR(2))
    				
    					SET @DIA_SEMANA = DATEPART(DW,@DATA_OUT)
    	--Verifica o dia da semana na variável @DIA_SEMANA. 
    	-- 1 = Domingo; 2 = Segunda; 3 = Terça; 4 = Quarta; 5 = Quinta; 6 = Sexta; 7 = Sábado; 
    	--Para ocorrer nesta forma o sistema tem que estar com SET DATEFIRST 7
    						IF @DIA_SEMANA = 7
    							BEGIN
    								SET @DIA = @DIA - 1
    							END
    						IF @DIA_SEMANA = 1
    							BEGIN
    								SET @DIA = @DIA - 2
    							END
    					
    					SET @DATA_OUT = CAST(@ANO AS CHAR(4)) + '/' +  CAST(@MES AS CHAR(2)) + '/' + CAST(@DIA AS CHAR(2))
    					
    				SELECT @VALIDA_FERIADO = COUNT(*)
    				FROM DBINTECH.DBO.TB_FERIADO
    				WHERE CONVERT(DATE,DT_FERIADO) = @DATA_OUT
    			END
    		IF LEN(@MES) = 1
    			BEGIN
    				SET @DATA_OUT = CAST(@ANO AS CHAR(4)) + '/0' +  CAST(@MES AS CHAR(1)) + '/' + CAST(@DIA AS CHAR(2))
    			END
    		IF LEN(@MES) = 2
    			BEGIN
    				SET @DATA_OUT = CAST(@ANO AS CHAR(4)) + '/' +  CAST(@MES AS CHAR(2)) + '/' + CAST(@DIA AS CHAR(2))
    			END	
    	END		  
    RETURN @DATA_OUT
    END
    
    GO

    São bem antigas, foi no meu inicio de sql server, mas funcionam, quebre um pouco a cabeça analisando que vc entenderá. Abração

    quinta-feira, 21 de março de 2013 21:24