Inquiridor
Dias Úteis

Pergunta
-
Srs.
Boa tarde,Estou com problema de dias úteis.
Tenho 2 campos na tabela:
- Data de Chegada
- Data de SaídaSo 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 é 17h00Não podendo esquecer q não posso somar feriados
Obrigado pela ajuda!
Ricardo Freitas
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
-
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 20 de março de 2013 17:52
-
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]
-
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