none
Días habíles sin feriados RRS feed

  • Pregunta

  • Buen día,

    Actualmente requiero una función para calcular una fecha especifica en este caso el día 10 de cada mes teniendo en cuenta lo siguiente:

    - No se deben incluir fines de semana

    - No se incluyen feriados 

    Ejemplo: Si el día 10 es un sabado o un domingo se tomaría la siguiente fecha es decir el día lunes en este caso si es un sabado se tomaría el lunes 12 pero si ese día es feriado se tomaria el martes 13, pero si la fecha del día 10 es entre semana se tomaría esa misma fecha.

    lunes, 7 de septiembre de 2020 16:17

Todas las respuestas

  • Te pongo un script con funciones que te ayudaran:

    Mira el ultimo ejemplo:

    ------------------------------------------------------------------------------
    -----------------      Funciones Fecha     ----------------- 
    ------------------------------------------------------------------------------

    . Para obtener el día de hoy.

    SELECT GETDATE() 'Hoy'

    2. Para obtener el día de ayer.

    SELECT DATEADD(d,-1,GETDATE()) 'Ayer'

    3. Inicio del día actual.

    SELECT DATEADD(dd,DATEDIFF(dd,0,GETDATE()),0) 'Inicio de este día'

    4. Fin del día actual

    SELECT DATEADD(ms,-3,DATEADD(dd,DATEDIFF(dd,0,GETDATE()),1)) 'Fin de este día'

    5. Inicio de ayer.

    SELECT DATEADD(dd,DATEDIFF(dd,0,GETDATE()),-1) 'Inicio de ayer'

    6. Fin de ayer.

    SELECT DATEADD(ms,-3,DATEADD(dd,DATEDIFF(dd,0,GETDATE()),0)) 'Fin de ayer'

    7. Primer día de la semana actual.

    SELECT DATEADD(wk,DATEDIFF(wk,0,GETDATE()),0) 'Primer día de la semana actual'

    8. Último día de la semana actual.

    SELECT DATEADD(wk,DATEDIFF(wk,0,GETDATE()),6) 'Último día de la semana actual'

    9. Primer día de la semana pasada.

    SELECT DATEADD(wk,DATEDIFF(wk,7,GETDATE()),0) 'Primer día de la semana pasada'

    10. Último día de la semana pasada.

    SELECT DATEADD(wk,DATEDIFF(wk,7,GETDATE()),6) 'Último día de la semana pasada'

    11. Primer día del mes actual.

    SELECT DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0) 'Primer día del mes actual'

    12. Último día del mes actual.

    SELECT DATEADD(ms,-3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,GETDATE())+1,0))) 'Último día del mes actual'

    13. Primer día del mes pasado.

    SELECT DATEADD(mm,-1,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) 'Primer día del mes pasado'

    14. Último día del mes pasado.

    SELECT DATEADD(ms,-3,DATEADD(mm,0,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0))) 'Último día del mes pasado'

    15. Primer día de este año.

    SELECT DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0) 'Primer día de este año'

    16. Último día de este año.

    SELECT DATEADD(ms,-3,DATEADD(yy,0,DATEADD(yy,DATEDIFF(yy,0,GETDATE())+1,0))) 'Último día de este año'

    17. Primer día del año pasado.

    SELECT DATEADD(yy,-1,DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0)) 'Primer día del año pasado'

    18. Último día del año pasado.

    SELECT DATEADD(ms,-3,DATEADD(yy,0,DATEADD(yy,DATEDIFF(yy,0,GETDATE()),0))) 'Último día del año pasado'

    19. Primer día del próximo mes.

    SELECT DATEADD(mm,1,DATEADD(mm,DATEDIFF(mm,0,GETDATE()),0)) 'Primer día del próximo mes'

    20. Último día del próximo mes.

    SELECT DATEADD(ms,-3,DATEADD(mm,DATEADD(mm,(DATEDIFF(mm,0,GETDATE()),0))) 'Último día del próximo mes'



    ----  Primer y ultimo dia del mes
    declare @mydate as date

    SELECT @mydate = GETDATE()
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@mydate)),@mydate),101) ,
    'Último día del mes anterior'
    UNION
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@mydate)-1),@mydate),101) AS Date_Value,
    'Primer día del mes corriente' AS Date_Type
    UNION
    SELECT CONVERT(VARCHAR(25),@mydate,101) AS Date_Value, 'Hoy' AS Date_Type
    UNION
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate)),101) ,
    'Último día del mes corriente'
    UNION
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))-1),DATEADD(mm,1,@mydate)),101) ,
    'Primer día del mes siguiente'

    lunes, 23 de noviembre de 2020 11:02
  • Hola Nelson Javier:

    Lo que solicitas requiere de una tabla de "feriados". Con la siguiente función te devolverá siempre lunes, pero tienes que tener en cuenta dos cosas.

    La primera: Tienes que poner el primer día de la semana como lunes, o establecerlo en la query. Si no lo pones, o prefieres que sea el domingo, con cambiar los When del case para 5 y 6 también vale.

    DateFirst

    SET DATEFIRST 1;

    La segunda es la ya comentada. No hay manera de saber lo que es un día "feriado" en SQL Server, para eso tienes que crearte un calendario de feriados, y de el entonces ya se puede leer.

    Create Function dbo.nextdatenoweekend
    				(
    				@Mydate Date
    				)
    Returns Date
    As
    	Begin
    		Return (
    				 Select 
    					   Case DatePart(weekday, DateAdd(month, 1, @Mydate))
    							When 6 Then DateAdd(month, 1, DateAdd(day, 2, @Mydate))
    							When 7 Then DateAdd(month, 1, DateAdd(day, 1, @Mydate))
    						Else DateAdd(month, 1, @Mydate)
    						End As nextdate
    			   );
    	End;

    Su funcionamiento.

    Set dateFirst 1;
    Declare @tableFechas table (id int, fecha date)
    Insert into @tableFechas (id, fecha)
    values
    (1,'20201013'),
    (2,'20201014'),
    (3,'20201015'),
    (4,'20201016');
    
    select dbo.nextdatenoweekend(t.fecha)
    from @tableFechas t

    Si le pasamos como parámetro el 13 de octubre, retorna 13 de noviembre.

    Si le pasamos como parámetro el 14 de octubre como el 14 de noviembre es sábado, retorna lunes 16.

    Si le pasamos como parámetro el 15 de octubre como el 15 de noviembre es domingo, retorna lunes 16.

    Si le pasamos como parámetro el 16 de octubre, retorna 16 de noviembre.


    lunes, 23 de noviembre de 2020 11:56