c# - publico - feriados 2018 peru decretados por el gobierno
¿Cómo determino un feriado público en el servidor Sql? (23)
Tengo una aplicación escrita en c # que no se puede ejecutar en un día festivo o un fin de semana. He buscado un poco y no he encontrado ningún lugar (oficial) que brinde todos los días festivos para el próximo decir 50 años.
Si puedo obtener estos, simplemente los insertaré a granel en mi tabla de fiestas del servidor sql y lo usaré. Sin embargo, no puedo encontrar esta información en ningún lado.
¿Alguien sabe si el servidor Sql tiene algún soporte para días festivos o un algoritmo de algún tipo para resolverlos? O alguien consiguió un lugar oficial desde el que puedo insertar a granel.
Gracias.
EDITAR: ¡Por argumentos, supongamos que queremos feriados públicos en Inglaterra!
¿No es un día festivo muy dependiente de la localidad?
Programaticamente, no hay forma de calcular esto. Alternativamente, deberá encontrar una lista oficial de vacaciones para cada una de sus configuraciones regionales. Y aun así, no obtendrá la granularidad que desea.
Además de permitir que el usuario configure qué días son festivos, sería bueno que permitiera al usuario seleccionar un calendario para importar o incluso suscribirse. iCalShare tiene una buena lista. Sin embargo, probablemente sea demasiado trabajo para una función que es simplemente agradable.
Ahhh, calendarios de vacaciones. La pesadilla de la vida de cualquier programador de banco de inversión. No hay forma de hacerlo, aparte de mantener tu propia lista, ¡me temo!
En nuestras aplicaciones lo tenemos como parte de la configuración del usuario. Existe un lugar para que los usuarios configuren lo que consideran festividades públicas / bancarias para el futuro que deseen. Para facilitar su uso, existe la posibilidad de copiarlos por fecha de años anteriores. Esto también les permite establecer festividades públicas ''personalizadas'', tal vez un día que la compañía trata como festivo pero que no es oficialmente oficial ...
Sin embargo, desde el punto de vista programático, no hay ningún supuesto en absoluto. Es solo una tabla de fechas mantenida por el usuario.
(Esto incluye el Reino Unido porque, como se indicó anteriormente, algunos días festivos varían y no son inamovibles, y algunas veces hay días excepcionales especiales).
Hasta donde sé, no hay ninguna fuente ''oficial'', y esto es de hecho altamente dependiente de la configuración regional. Tendría que administrar estos manualmente. Una buena fuente parece ser:
http://en.wikipedia.org/wiki/List_of_holidays_by_country
Incluso bajo estas circunstancias, es muy difícil de manejar. Por ejemplo, vivo en Bélgica, y diferentes partes del país tienen diferentes vacaciones. Los trabajadores gubernamentales, por ejemplo, tienen vacaciones diferentes en comparación con el resto de la fuerza laboral, y esto está en el mismo código de localidad.
Hay un servicio web disponible para esto:
http://www.holidaywebservice.com/Holidays/servicesAvailable_HolidayService.aspx
Los días festivos rara vez están disponibles durante los próximos 50 años. En algunos países son conocidos por los próximos años, en algunos países no. También varían según los estados e incluso las ciudades.
Necesitarás mantener una tabla de vacaciones para esto. Para una internacionalización adecuada, incluso necesita mantener qué días son fines de semana para esto, ya que incluso eso no es universal. Del mismo modo, es posible que necesite mantener los días festivos según la configuración regional para que su programa sepa que los usuarios en Londres tienen el día libre pero los usuarios en Turquía no.
Esto debería ser completamente configurable por el usuario. Por lo que usted sabe, el cumpleaños del propietario de la compañía podría ser un día "estándar". Intenta encontrar esas vacaciones en la web.
Por último, no desea almacenar 50 años de datos de vacaciones. Solo será inexacto y potencialmente ralentizará todo tu código.
Para agregar lo que otras personas ya han dicho, poner la suya en una mesa es la única forma real de hacerlo. Un ejemplo clásico es el feriado bancario adicional para el jubileo de oro de la Reina. Esto solo se anunció un par de años antes, y no había forma de que pudieras tenerlo con cincuenta años de anticipación.
Debido a esto, existe una serie de servicios comerciales para proporcionar estos datos de manera confiable. Uno es GoodBusinessDay.com pero no tengo experiencia con él.
Si es solo Inglaterra, ¡entonces puedes resolverlos por ti mismo! Necesitará obtener un algoritmo confiable para determinar la Pascua, pero de lo contrario diría que podría hacerlo en menos de una hora.
¿Pero te refieres solo a Inglaterra o al Reino Unido? Debido a que Escocia tiene diferentes festividades (Navidad, Hogmanay y el Día de San Andrés) e Irlanda del Norte, Gales y muy probablemente la Isla de Man y las Islas del Canal también deberían comercializarse de manera diferente.
Como se señaló en otra parte, una vez que su alcance se hace más amplio, es aún más complejo. Hay fiestas locales, medio días, días en que los bancos están abiertos, pero no las bolsas de valores, todo tipo de horrores.
Si realmente no puede administrar las vacaciones usted mismo y no tiene usuarios a los que se pueda dar la responsabilidad, entonces le sugiero que vuelva a su restricción de "no se puede ejecutar en días festivos" y busque la manera de hacerlo. remoto...
google calendar public hollydays Quizás podrías recuperar los datos de tu país / región con el servicio web de Google Calendar.
Encontré otro servicio para feriados públicos en todo el mundo, presuntamente utilizado por los editores de calendario:
Este algoritmo puede reducir la cantidad de configuración manual en países que observan festividades cristianas. Debe ser trivial convertir a C #:
http://en.wikipedia.org/wiki/Computus#Anonymous_Gregorian_algorithm
Las instituciones financieras se suscribirán a los servicios que brindan actualizaciones periódicas a los calendarios bancarios para varias localidades.
Tenga en cuenta que a menudo hay diferencias entre los días festivos bancarios y las vacaciones ordinarias. Un ejemplo de esto en los Estados Unidos es que pasó el Día de la Independencia, donde el gobierno federal reconoció el feriado el 3 de julio, pero el Banco de la Reserva Federal de Nueva York estaba abierto.
Si me ayuda, tengo un archivo de texto que enumera las reglas para calcular los días festivos bancarios definidos para todos los centros financieros principales y secundarios. La forma habitual de definir esto es por centro de negocios, como en Londres, Nueva York, Frankfurt, etc., y no por país. Como ejemplo, aquí están las reglas y explicaciones para Londres y algunos otros. Si alguien quiere todo, házmelo saber. Este lote debería funcionar desde 1990 hasta 2030 como muy pronto. Obviamente, no se anunciarán nuevas vacaciones después de la reunión de los archivos (creo que en 2006).
/*
* This file describes holiday calendars in the following way:
* 1. The "n"th "dow" in the month "m", means the 3rd Wednesday in August = "ALWAYS,3,WED,AUG"
* 2. The last etc "dow" in month "m", e.g. the last Monday in June = "LAST,MON,JUN"
* 3. A set date which if on a Sat or Sun is taken on the Monday, eg 13th Aug. = "FWDFROM,13,AUG"
* 4. A set date which if on a Sat is taken on Fri, if Sun on the Mon = "CLOSESTTO,13,AUG"
* 5. A set date which, if on a Sat is unchanged, but if a Sun is taken on the Mon = "FWDFROMSUN,13,AUG"
* 6. A set date which is unchanged if it happens to be on a weekend = "REMAINS,13,AUG"
* 7. The first day on or after day "x" in month "m" e.g. 1st Monday on or after 16th Jan = "FIRSTAFTER,16,MON,JAN"
* 8. A holiday which is a set number of days relative to Easter Sunday, e.g Easter Monday = "EASTER,1"
* 9. A holiday on one specified date only. e.g. 13th Aug 1997 = "ONEOFF,13,AUG,1997"
* 10.A specific date which has been added but is not a holiday and must be removed. = "REMOVE,13,AUG,1997"
* Note REMOVE only works on a date which is already in the calendar: you cannot remove a date which is yet to be added.
* If there is any text after the definition of the holiday it will appear in the date calendar description,
* e.g. you can have "FWDFROM,25,DEC,Christmas Day", if you wish.
*/
LON: HolidayCalendar {
Config: String {
FWDFROM,1,JAN,New Year''s Day;
EASTER,-2,Good Friday;
EASTER,1,Easter Monday;
ALWAYS,1,MON,MAY,Early May Bank Holiday;
LAST,MON,MAY,Spring Bank Holiday;
REMOVE,27,MAY,2002,Spring Bank Holiday;
ONEOFF,3,JUN,2002,Spring Bank Holiday;
ONEOFF,4,JUN,2002,Spring Bank Holiday;
LAST,MON,AUG,Summer Bank Holiday;
FWDFROM,25,DEC,Christmas;
FWDFROM,26,DEC,Boxing Day;
ONEOFF,31,DEC,1999,Millenium;
}
EndDate: 31-Dec-2030;
Name: London;
StartDate: 01-Jan-1990;
Weekend: SAT,SUN,;
}
HKG: HolidayCalendar {
Config: String {
FWDFROM,1,JAN,New Year''s Day;
ONEOFF,16,FEB,1999,Chinese New Year;
ONEOFF,17,FEB,1999,Chinese New Year;
ONEOFF,18,FEB,1999,Chinese New Year;
FWDFROM,5,FEB,2000,Chinese New Year;
FWDFROM,6,FEB,2000,Chinese New Year;
FWDFROM,7,FEB,2000,Chinese New Year;
CLOSESTTO,5,APR,Ching Ming;
EASTER,-2,Good Friday;
EASTER,1,Easter Monday;
FWDFROM,1,MAY,Labour Day;
ONEOFF,18,JUN,1999,Dragon Boat Festival;
FWDFROM,1,JUL,SAR Establishment Day;
FWDFROM,1,OCT,National Day;
FWDFROM,2,OCT,National Day;
ONEOFF,25,SEP,1999,Mid Autumn Festival;
ONEOFF,17,OCT,1999,Chung Yeung;
FWDFROM,25,DEC,Christmas;
FWDFROM,26,DEC,Boxing Day;
ONEOFF,4,MAY,1998,May bank holiday;
ONEOFF,25,MAY,1998,May bank holiday;
ONEOFF,3,MAY,1999,May bank holiday;
ONEOFF,31,MAY,1999,May bank holiday;
ONEOFF,1,JUL,1997;
ONEOFF,2,JUL,1997;
}
EndDate: 31-Dec-2030;
Name: Hong Kong;
StartDate: 01-Jan-1990;
Weekend: SAT,SUN,;
}
MIL: HolidayCalendar {
Config: String {
FWDFROM,1,JAN,New Year''s Day;
REMAINS,6,JAN,Epiphany;
REMAINS,25,APR,Liberation Day;
REMAINS,1,MAY,May Day;
REMAINS,15,AUG,Assumption;
REMAINS,1,NOV,All Saint''s;
REMAINS,8,DEC,Immaculate Conception;
EASTER,1,Easter Monday;
FWDFROM,25,DEC,Christmas;
FWDFROM,26,DEC,Boxing Day;
}
EndDate: 31-Dec-2030;
Name: Milan;
StartDate: 01-Jan-1990;
Weekend: SAT,SUN,;
}
FFT: HolidayCalendar {
Config: String {
REMAINS,1,JAN,New Year''s Day;
EASTER,-2,Good Friday;
EASTER,1,Easter Monday;
REMAINS,1,MAY,Labour Day;
EASTER,39,Ascension Day;
EASTER,50,Whit Monday;
EASTER,60,Corpus Christi;
REMAINS,3,OCT,Day of German Unity;
REMAINS,24,DEC,Christmas Eve;
REMAINS,25,DEC,Christmas Day;
REMAINS,26,DEC,Boxing Day;
}
EndDate: 31-Dec-2030;
Name: Frankfurt;
StartDate: 01-Jan-1990;
Weekend: SAT,SUN,;
}
ZUR: HolidayCalendar {
Config: String {
REMAINS,1,JAN,New Year''s Day;
REMAINS,2,JAN,New Year''s Holiday;
EASTER,-2,Good Friday;
EASTER,1,Easter Monday;
EASTER,39,Ascension Day;
EASTER,50,Whit Monday;
REMAINS,1,AUG,August Bank Holiday;
REMAINS,1,MAY, LABOUR DAY;
REMAINS,25,DEC,Christmas;
REMAINS,26,DEC,Boxing Day;
}
EndDate: 31-Dec-2030;
Name: Zurich;
StartDate: 01-Jan-1990;
Weekend: SAT,SUN,;
}
NYK: HolidayCalendar {
Config: String {
REMAINS,1,JAN,New Year''s Day;
ALWAYS,3,MON,JAN,Martin Luther King;
ALWAYS,3,MON,FEB,President''s Day;
LAST,MON,MAY,Memorial Day;
CLOSESTTO,4,JUL,Independence Day;
ALWAYS,1,MON,SEP,Labor Day;
ALWAYS,2,MON,OCT,Columbus Day;
REMAINS,11,NOV,Veteran''s Day;
ALWAYS,4,THU,NOV,Thanksgiving;
FWDFROMSUN,25,DEC,Christmas Day;
ONEOFF,12,NOV,2001,Veteran''s Day;
}
EndDate: 31-Dec-2030;
Name: New York;
StartDate: 01-Jan-1990;
Weekend: SAT,SUN,;
}
Para muchos de nosotros en los Estados Unidos, existe una lista estándar de días festivos que se puede calcular de manera determinista.
Inspirándose en el código de Vonpato, armé una única declaración SQL que hace uso de las funciones de ventana (sobre (partición por ...)), nuevas en SQL Server 2008, para determinar la enésima o última ocurrencia de un día de la semana dentro de un mes .
Esto debe ejecutarse contra "DimDate", una tabla de dimensión de fecha estándar como la encontrada en un almacén de datos. http://www.codeproject.com/Articles/647950/Create-and-Populate-Date-Dimension-for-Data-Wareho
SELECT
case
when DayNameOfWeek = ''Saturday'' then dateadd(day, -1, FullDate)
when DayNameOfWeek = ''Sunday'' then dateadd(day, 1, FullDate)
else FullDate end as ''Holiday Date''
FROM (
select row_number() over (partition by DayNameOfWeek, MonthOfYear, CalendarYear order by FullDate) as WeekdayOrdinal,
count(*) over (partition by DayNameOfWeek, MonthOfYear, CalendarYear ) as MaxOrdinal, *
from DimDate
) D
WHERE
(D.[MonthName] = ''January'' and [DayOfMonth] = 1) /* New Years Day */
OR (D.[MonthName] = ''January'' and DayNameOfWeek = ''Monday'') and WeekdayOrdinal = 3 /* MLK Day */
OR (D.[MonthName] = ''February'' and DayNameOfWeek = ''Monday'') and WeekdayOrdinal = 3 /* President''s Day */
OR (D.[MonthName] = ''May'' and DayNameOfWeek = ''Monday'') and WeekdayOrdinal = MaxOrdinal /* Memorial Day */
OR (D.[MonthName] = ''September'' and DayNameOfWeek = ''Monday'') and WeekdayOrdinal = 1 /* Labor Day */
OR (D.[MonthName] = ''October'' and DayNameOfWeek = ''Monday'') and WeekdayOrdinal = 2 /* Columbus Day */
OR (D.[MonthName] = ''November'' and [DayOfMonth] = 11) /* Veteran''s Day */
OR (D.[MonthName] = ''November'' and DayNameOfWeek = ''Thursday'') and WeekdayOrdinal = 4 /* Thanksgiving */
OR (D.[MonthName] = ''December'' and [DayOfMonth] = 25 ) /* Christmas */
ORDER BY FullDate
En algunos países (es decir, en Polonia) el número de días feriados se profundiza en Semana Santa.
Al final de esta publicación, puede encontrar un código para calcular la fecha de consumo y algunas vacaciones que dependen de ello.
Las vacaciones no movibles, es decir, el 1 de enero, las fiestas navideñas, el día de la independencia, etc. se pueden almacenar en algún lugar de la mesa.
Tenga en cuenta que en un número de países tiene regiones / estados que pueden tener días festivos adicionales, pero para calcular todas las vacaciones para su país o región debería ser posible.
En el Reino Unido, es decir, tiene vacaciones bancarias que tienen algunas reglas que puede usar en su código. - Primer lunes de mayo - Último lunes de mayo - Último lunes de agosto, etc.
Por favor, consulte este enlace para más detalles http://en.wikipedia.org/wiki/Public_holidays_in_the_United_Kingdom
Cómo calcular la fecha de Pascua en SQL:
http://www.smart.net/~mmontes/nature1876.html
http://ghiorzi.org/easterda.htm
declare @a int
declare @b int
declare @c int
declare @d int
declare @e int
declare @f int
declare @g int
declare @h int
declare @i int
declare @j int
declare @k int
declare @l int
declare @m int
declare @n int
declare @Year int
declare @Month int
declare @Day int
declare @EasterSunday datetime
declare @EasterMonday datetime
declare @Pentecost datetime
declare @CorpusChristi datetime
SET @Year = 2014
SET @a = @Year%19;
SET @b = @Year/100;
SET @c = @Year%100;
SET @d = @b/4;
SET @e = @b%4;
SET @f = @c/4;
SET @g = @c%4;
SET @h = (@b + 8)/25;
SET @i = (@b - @h + 1)/3;
SET @j = (19*@a + @b - @d - @i + 15) % 30;
SET @k = (32 + 2*@e + 2*@f - @j - @g) % 7;
SET @m = (@a + 11*@j + 22*@k) / 451;
SET @n = @j + @k - 7*@m + 114;
SET @Month = @n/31;
SET @Day = (@n % 31) + 1;
--PRINT @Year
--PRINT @Month
--PRINT @Day
SET @EasterSunday = dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1)
SET @EasterMonday = dateadd(day,1,@EasterSunday)
SET @Pentecost = dateadd(day,49,@EasterSunday)
SET @CorpusChristi = dateadd(day,60,@EasterSunday)
PRINT ''Easter Sunday: '' + CONVERT(VARCHAR, @EasterSunday,120) + '' ['' + DATENAME(dw, @EasterSunday) + '']''
PRINT ''''
PRINT ''Easter Monday: '' + CONVERT(VARCHAR, @EasterMonday,120) + '' ['' + DATENAME(dw, @EasterMonday) + '']''
PRINT ''''
PRINT ''Pentecost: '' + CONVERT(VARCHAR, @Pentecost,120) + '' ['' + DATENAME(dw, @Pentecost) + '']''
PRINT ''''
PRINT ''CorpusChristi: '' + CONVERT(VARCHAR, @CorpusChristi,120) + '' ['' + DATENAME(dw, @CorpusChristi) + '']''
PRINT ''''
Para aquellos que tienen problemas para encontrar el último jueves de noviembre para Acción de Gracias, empiezo encontrando el último día del mes y luego uso un bucle WHILE () a menos un día y verifico el nombre de la fecha hasta que el nombre de fecha sea el jueves:
DECLARE @LastThursday DateTime = DATEADD(s,-1,DATEADD(mm,DATEDIFF(m,0,CONVERT(datetime,CONVERT(varchar,YEAR(GETDATE()))+''-11-01''))+1,0))
WHILE DATENAME(weekday,@LastThursday) <> ''Thursday''
BEGIN
SET @LastThursday = DATEADD(day,DATEDIFF(day,0,@LastThursday)-1,0)
END
SELECT @LastThursday
Simplifiquemos esto:
case
-- New Year''s Day
when DATEPART(MM, @DATE) = 1
and DATEPART(DD, @DATE) = 1
and DATEPART(DW, @DATE) in (2,3,4,5,6) then ''Y''
when DATEPART(MM, @DATE) = 12
and DATEPART(DD, @DATE) = 31
and DATEPART(DW, @DATE) = 6 then ''Y''
when DATEPART(MM, @DATE) = 1
and DATEPART(DD, @DATE) = 2
and DATEPART(DW, @DATE) = 2 then ''Y''
-- Memorial Day (last Monday in May)
when DATEPART(MM, @DATE) = 5
and DATEPART(DD, @DATE) between 25 and 31
and DATEPART(DW, @DATE) = 2 then ''Y''
-- Independence Day
when DATEPART(MM, @DATE) = 7
and DATEPART(DD, @DATE) = 4
and DATEPART(DW, @DATE) in (2,3,4,5,6) then ''Y''
when DATEPART(MM, @DATE) = 7
and DATEPART(DD, @DATE) = 3
and DATEPART(DW, @DATE) = 6 then ''Y''
when DATEPART(MM, @DATE) = 7
and DATEPART(DD, @DATE) = 5
and DATEPART(DW, @DATE) = 2 then ''Y''
-- Labor Day (first Monday in September)
when DATEPART(MM, @DATE) = 9
and DATEPART(DD, @DATE) between 1 and 7
and DATEPART(DW, @DATE) = 2 then ''Y''
-- Thanksgiving Day (fourth Thursday in November)
when DATEPART(MM, @DATE) = 11
and DATEPART(DD, @DATE) between 22 and 28
and DATEPART(DW, @DATE) = 5 then ''Y''
-- Black Friday (day after Thanksgiving)
when DATEPART(MM, @DATE) = 11
and DATEPART(DD, @DATE) between 23 and 29
and DATEPART(DW, @DATE) = 6 then ''Y''
-- Christmas Day
when DATEPART(MM, @DATE) = 12
and DATEPART(DD, @DATE) = 25
and DATEPART(DW, @DATE) in (2,3,4,5,6) then ''Y''
when DATEPART(MM, @DATE) = 12
and DATEPART(DD, @DATE) = 24
and DATEPART(DW, @DATE) = 6 then ''Y''
when DATEPART(MM, @DATE) = 12
and DATEPART(DD, @DATE) = 26
and DATEPART(DW, @DATE) = 2 then ''Y''
else ''N'' end
Los días festivos en el Reino Unido son principalmente computables, pero definitivamente no todos computables.
El gobierno del Reino Unido proporciona una API ( https://www.gov.uk/bank-holidays.json ) que le brinda esta información.
Encuentro este tema extraño. Después de tratar de encontrar y escribir funciones complicadas en MS, PHP o en este caso el lenguaje SQL, llegué a la conclusión de que es un ejercicio sin sentido. El código que terminé contiene más de 2000 caracteres y lleva horas corregirlo y depurarlo. Si lo piensas todo lo que tienes que hacer es escribir el número 7 que indica el día 1-365 para cada día festivo y una fila para cada año durante los próximos 100 años. Solo necesita cargar esos años o los próximos años de vacaciones una vez. Así que mantenga la tabla con 7 columnas y 100 filas y llénelas con los días correctos. Solo necesita hacer esto una vez cada 100 años y demorar menos de una hora y es portátil.
Acabo de recopilar información a través de Internet y vengo con esta manera fácil de calcular los días festivos de los EE. UU.
Vacaciones en los Estados Unidos
========================
DECLARE @Year char(4)
, @Date datetime
, @Holiday datetime
SET @Year = 2010
---- New Years Day
SET @Date=CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-01-01'' )
IF DATENAME( dw, @Date ) = ''Saturday''
SET @Date=@Date-1
ELSE IF DATENAME( dw, @Date ) = ''Sunday''
SET @Date=@Date+1
SELECT @Date [New Years Day], DATENAME( dw, @Date ) [DayOfWeek]
---- Martin L King''s Birthday ( 3rd Monday in January )
SET @Date = CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-01-01'' )
SET @Holiday = DATEADD( wk, DATEDIFF( wk, 0, dateadd( dd, 18-datepart( day, @Date ), @Date ) ), 0 ) -- 3rd Monday of the Month
SELECT @Holiday [Martin L King''s Birthday], DATENAME( dw, @Holiday ) [DayOfWeek]
---- President’s Day ( 3rd Monday in February )
SET @Date = CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-02-01'' )
SET @Holiday = DATEADD( wk, DATEDIFF( wk, 0, dateadd( dd, 18-datepart( day, @Date ), @Date ) ), 0 ) -- 3rd Monday of the Month
SELECT @Holiday [President’s Day], DATENAME( dw, @Holiday ) [DayOfWeek]
---- Memorial Day ( Last Monday in May )
SET @Date = CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-05-01'' )
SET @Holiday = DATEADD( wk, DATEDIFF( wk, 0, dateadd( dd, 30-datepart( day, @Date ), @Date ) ), 0 ) -- 5th Monday of the Month
SELECT @Holiday [Memorial Day], DATENAME( dw, @Holiday ) [DayOfWeek]
---- Independence Day ( July 4 )
SET @Date=CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-07-04'' )
IF DATENAME( dw, @Date ) = ''Saturday''
SET @Date=@Date-1
ELSE IF DATENAME( dw, @Date ) = ''Sunday''
SET @Date=@Date+1
SELECT @Date [Independence Day], DATENAME( dw, @Date ) [DayOfWeek]
---- Labor Day ( 1st Monday in September )
SET @Date = CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-09-01'' )
SET @Holiday = DATEADD( wk, DATEDIFF( wk, 0, dateadd( dd, 6-datepart( day, @Date ), @Date ) ), 0 ) -- 1st Monday of the Month
SELECT @Holiday [Labor Day], DATENAME( dw, @Holiday ) [DayOfWeek]
---- Columbus Day ( 2nd Monday in October )
SET @Date = CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-10-01'' )
SET @Holiday = DATEADD( wk, DATEDIFF( wk, 0, dateadd( dd, 12-datepart( day, @Date ), @Date ) ), 0 ) -- 2nd Monday of the Month
SELECT @Holiday [Columbus Day], DATENAME( dw, @Holiday ) [DayOfWeek]
---- Veteran’s Day ( November 11 )
SET @Date=CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-11-11'' )
IF DATENAME( dw, @Date ) = ''Saturday''
SET @Date=@Date-1
ELSE IF DATENAME( dw, @Date ) = ''Sunday''
SET @Date=@Date+1
SELECT @Date [Veteran’s Day], DATENAME( dw, @Date ) [DayOfWeek]
---- Thanksgiving Day ( 4th Thursday in November )
SET @Date = CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-11-04'' )
SET @Holiday = DATEADD( wk, DATEDIFF( wk, 0, dateadd( dd, 22-datepart( day, @Date ), @Date ) ), 0 )+3 -- 4th Thursday of the Month
SELECT @Holiday [Thanksgiving Day], DATENAME( dw, @Holiday ) [DayOfWeek]
---- Christmas Day ( December 25 )
SET @Date=CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-12-25'' )
IF DATENAME( dw, @Date ) = ''Saturday''
SET @Date=@Date-1
ELSE IF DATENAME( dw, @Date ) = ''Sunday''
SET @Date=@Date+1
SELECT @Date [Christmas Day], DATENAME( dw, @Date ) [DayOfWeek]
---- New Years Eve Day
SET @Date=CONVERT( datetime, CONVERT(varchar, YEAR( @Year ) )+''-12-31'' )
IF DATENAME( dw, @Date ) = ''Saturday''
SET @Date=@Date-1
ELSE IF DATENAME( dw, @Date ) = ''Sunday''
SET @Date=@Date+1
SELECT @Date [New Years Day], DATENAME( dw, @Date ) [DayOfWeek]
Puede usar la biblioteca Nager.Date para calcular los días festivos. https://github.com/tinohager/Nager.Date
Nuget
PM> install-package Nager.Date
Ejemplo:
var publicHolidays = DateSystem.GetPublicHoliday(CountryCode.GB, 2017);
foreach (var publicHoliday in publicHolidays)
{
var name = publicHoliday.LocalName;
}