none
Problema en Fechas Ejecución JOB SQL Server 2008 RRS feed

  • Pregunta

  • Hola a todos, tengo el siguiente problema, 

    tengo un procedimiento almacenado que me calcula horas hábiles entre dos fechas, al ejecutar este procedimiento "manualmente" directo desde la query funciona perfectamente, sin embargo, al programar un JOB este me da números distintos, o simplemente a veces no se ejecuta, cuando no se ejecuta, el log del job me dice que la conversión a valores de fechas esta fuera del rango.

    El usuario con el que ejecuto el procedimiento esta predeterminado a idioma Ingles, y es el mismo con el que ejecuto la query manualmente (que es cuando funciona bien)

    Alguna idea??

    Gracias desde ya por las ideas y sugerencias.

    jueves, 7 de septiembre de 2017 15:26

Respuestas

  • Lo resolví de esta forma: puse la instrucción en el paso del job, antes de ejecutar el procedimiento:

    SET LANGUAGE us_english

    • Marcado como respuesta arieluko_86 jueves, 7 de septiembre de 2017 17:48
    jueves, 7 de septiembre de 2017 17:48

Todas las respuestas

  • Hola,

       Nos puedes pasar al Query de como estas calculando las horas.


    Jose Miguel Salas C

    jueves, 7 de septiembre de 2017 15:39
  • Por supuesto, aquí va

    USE [SERTEC_TEMP]
    GO
    /****** Object:  UserDefinedFunction [dbo].[CalculaHoraHabil]    Script Date: 09/07/2017 12:50:27 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- Batch submitted through debugger: SQLQuery147.sql|7|0|C:\Users\gortiz\AppData\Local\Temp\5\~vs9C6.sql
    
    -- =============================================
    -- Author:		<Gilbert Ortiz>
    -- Create date: <27 Abril 2017>
    -- Description:	<Funcion para calcular tiempo
    --              hábil entre 2 fechas>
    -- =============================================
    ALTER FUNCTION [dbo].[CalculaHoraHabil] 
    (
    	-- Add the parameters for the function here
    	@d_FechaDesde datetime,
    	@d_FechaHasta datetime,
    	@d_HoraIniJornada datetime,
    	@d_HoraFinJornada datetime
    )
    RETURNS numeric(10,4)
    AS
    BEGIN
    	declare @d_New_FH_Ini datetime
    	declare @d_New_FH_Fin datetime
    	declare @d_New_F_Ini datetime
    	declare @d_New_F_Fin datetime
    	declare @d_New_H_Ini datetime
    	declare @d_New_H_Fin datetime
    	declare @n_FinSemana numeric(10,4)
    	declare @n_TiempoW numeric(10,4)
    	declare @n_TiempoSinFest numeric(10,4)
    	declare @n_TiempoConFest numeric(10,4)
    	declare @n_Festivos numeric(10,4)
    	declare @n_Tiempo numeric(10,4)
    
    	Set @d_New_FH_Ini = @d_FechaDesde;
        Set @d_New_FH_Fin = @d_FechaHasta;
     
    	Set @d_New_F_Ini = CONVERT(varchar(10), @d_FechaDesde,126);
        Set @d_New_F_Fin = CONVERT(varchar(10), @d_FechaHasta,126);
    
    	Set @d_New_H_Ini = convert(varchar(5),@d_FechaDesde,108); --format(@d_FechaDesde,'HH:mm'); 
        Set @d_New_H_Fin = convert(varchar(5),@d_FechaHasta,108); --format(@d_FechaHasta,'HH:mm');
    	
    	/* Adecuamos la fecha y hora de inicio respecto al fin del horario */
        if (@d_New_H_Ini > @d_HoraFinJornada ) Set @d_New_FH_Ini= @d_New_F_Ini + @d_HoraFinJornada;
    
    	/* Adecuamos la fecha y hora de inicio respecto al inicio del horario */
    	if (@d_New_H_Ini < @d_HoraIniJornada ) Set @d_New_FH_Ini= @d_New_F_Ini + @d_HoraIniJornada;
    
    	 /* Adecuamos la fecha y hora de inicio respecto a los fines de semana */
    	if (datepart(dw,@d_New_FH_Ini) = 7 ) Set @d_New_FH_Ini= @d_New_F_Ini + 2 + @d_HoraIniJornada;
    	if (datepart(dw,@d_New_FH_Ini) = 1 ) Set @d_New_FH_Ini= @d_New_F_Ini + 1 + @d_HoraIniJornada;
    
    	/* Adecuamos la fecha y hora de termino respecto al fin del horario */
        if (@d_New_H_Fin > @d_HoraFinJornada ) Set @d_New_FH_Fin= @d_New_F_Fin + @d_HoraFinJornada;
    
    	/* Adecuamos la fecha y hora de termino respecto al inicio del horario */
    	if (@d_New_H_Fin < @d_HoraIniJornada ) Set @d_New_FH_Fin= @d_New_F_Fin + @d_HoraIniJornada;
    
    	 /* Adecuamos la fecha y hora de termino respecto a los fines de semana*/
    	if (datepart(dw,@d_New_FH_Fin) = 7 ) Set @d_New_FH_Fin= @d_New_F_Fin + 2 + @d_HoraIniJornada;
    	if (datepart(dw,@d_New_FH_Fin) = 1 ) Set @d_New_FH_Fin= @d_New_F_Fin + 1 + @d_HoraIniJornada; 
    
    	Set @d_New_H_Ini = convert(varchar(5),@d_New_FH_Ini,108); --format(@d_New_FH_Ini,'HH:mm');
        Set @d_New_H_Fin = convert(varchar(5),@d_New_FH_Fin,108); --format(@d_New_FH_Fin,'HH:mm');
    
    	--print @d_New_FH_Ini;
    	--print @d_New_FH_Fin;
    
    	/* Calculamos los dias de fin de semana */
        Set @n_FinSemana =((datediff(day, @d_New_FH_Ini, @d_New_FH_Fin)+datepart(dw,@d_New_FH_Ini) )/7) *2;
    
    	/* Calculamos todos los dias sin fines de semana . Hay que quitarle un día... */
        Set @n_TiempoW = datediff(day, @d_New_FH_Ini, @d_New_FH_Fin) - 1 - @n_FinSemana;
    
    	if (@n_TiempoW < 0) Set @n_TiempoW = 0;
    
        Set @n_TiempoSinFest = @n_TiempoW;
    
        Set @n_TiempoConFest = @n_TiempoW * datediff(minute, @d_HoraIniJornada, @d_HoraFinJornada) + -- Dias transcurrido * horasDia
    							datediff(minute, @d_New_H_Ini, @d_HoraFinJornada) + -- horas de primer dia
                                datediff(minute, @d_HoraIniJornada, @d_New_H_Fin) ; -- horas del ultimo dia
    	Set @n_TiempoConFest = @n_TiempoConFest / 60;
    
    	/*print @n_TiempoW;
    	print @n_TiempoW*datediff(minute, @d_HoraIniJornada, @d_HoraFinJornada)/60;
    	print datediff( minute, @d_New_H_Ini, @d_HoraFinJornada)/60;
    	print datediff( minute, @d_HoraIniJornada, @d_New_H_Fin)/60;*/
    
    	/* Quitamos los festivos pero sin incluir los dias de inicio y fin , que tratamos luego */
    	Set @n_Festivos = 0;
    		SELECT @n_Festivos=COUNT(1) from [dbo].[TEMP_FERIADOS]
    		where 
    		replace(convert(VARCHAR,[FER_DIA],103),'/','') in (replace(convert(VARCHAR,@d_New_FH_Ini+1,103),'/',''),  replace(convert(VARCHAR,@d_New_FH_Fin+1,103),'/','')) --format([FER_DIA],'ddMMyyyy') in (format(@d_New_FH_Ini + 1,'ddMMyyyy'), format(@d_New_FH_Fin + 1,'ddMMyyyy'))
            AND datepart(dw,@d_New_FH_Ini) NOT IN (7,1);
       
    	Set @n_TiempoW = @n_TiempoW - @n_Festivos;
    
    	/* Calculamos el tiempo transcurrido en horas */
    		-- si es el mismo dia, horafin - horainicio
    	Set @n_Tiempo = 0;
        if ( datediff(day, @d_New_FH_Ini, @d_New_FH_Fin) = 0)
    		begin
    			Set @n_Tiempo = datediff(minute, @d_New_H_Ini,@d_New_H_Fin);
    			Set @n_Tiempo = @n_Tiempo / 60;  
    		end
        else
    		begin
    			Set @n_Tiempo = @n_TiempoW * datediff(minute ,@d_HoraIniJornada, @d_HoraFinJornada) + -- Dias transcurridos * horasDia
                              datediff(minute, @d_New_H_Ini, @d_HoraFinJornada) +  -- horas de primer dia
                              datediff(minute, @d_HoraIniJornada, @d_New_H_Fin) ; -- horas del ultimo dia
    			Set @n_Tiempo = @n_Tiempo / 60;
    		end
    
    	-- si el primer dia es festivo y no es sabado ni domingo, restamos las horas
    	Set @n_Festivos = 0;
        SELECT @n_Festivos=COUNT(1) from [dbo].[TEMP_FERIADOS]
    		where 
    		replace(convert(VARCHAR,[FER_DIA],103),'/','')  = replace(convert(VARCHAR,@d_New_FH_Ini,103),'/','')  --format([FER_DIA],'ddMMyyyy') = format(@d_New_FH_Ini,'ddMMyyyy') 
           AND datepart(dw,@d_New_FH_Ini) NOT IN (7,1);
    	
        if (@n_Festivos = 1)
    		begin
    			declare @Temp1 numeric(10,4);
    			Set @Temp1 = datediff(minute,@d_New_H_Ini, @d_HoraFinJornada);
    			Set @Temp1 =@Temp1/60;
    			Set @n_Tiempo = @n_Tiempo - @Temp1;
    		end
       
        -- si el ultimo día es festivo y no es sabado ni domingo , restamos las horas
    	Set @n_Festivos = 0;
        SELECT @n_Festivos=COUNT(1) from [dbo].[TEMP_FERIADOS]
    		where 
    		 replace(convert(VARCHAR,[FER_DIA],103),'/','')  = replace(convert(VARCHAR,@d_New_FH_Fin,103),'/','') --format([FER_DIA],'ddMMyyyy') = format(@d_New_FH_Fin,'ddMMyyyy')
           AND datepart(dw,@d_New_FH_Fin) NOT IN (7,1);
       
        if (@n_Festivos = 1)
    		begin
    			declare @Temp2 numeric(10,4);
    			Set @Temp2 = datediff( minute, @d_HoraIniJornada, @d_New_H_Fin);
    			Set @Temp2 =@Temp2/60;
    			Set @n_Tiempo = @n_Tiempo - @Temp2;
    		end
    
    	if (@n_Tiempo<0) Set @n_Tiempo = 0;
    
    
    	return @n_Tiempo;
    
    
    END
    
    

    jueves, 7 de septiembre de 2017 15:49
  • Lo resolví de esta forma: puse la instrucción en el paso del job, antes de ejecutar el procedimiento:

    SET LANGUAGE us_english

    • Marcado como respuesta arieluko_86 jueves, 7 de septiembre de 2017 17:48
    jueves, 7 de septiembre de 2017 17:48
  • Que formato usas para las literales de fecha y tiempo cuando ejecutas el procedimineto desde SQL Agent?


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    jueves, 7 de septiembre de 2017 17:55