Comment puis-je déterminer un jour férié dans Sql server?

j'ai une demande écrite en c# qui ne peut pas fonctionner un jour férié ou un week-end. J'ai cherché un peu et je n'ai trouvé nulle part (officiel) qui fournissent tous les jours fériés pour les 50 prochaines années.

si je peux obtenir ces derniers, je vais simplement les insérer en vrac dans ma table de vacances sql server et utiliser cela. Cependant, je ne trouve ces données nulle part.

est-ce que quelqu'un sait si Sql server a une prise en charge pour les jours fériés ou un algorithme quelconque pour les travailler? Ou n'importe qui a quelque chose d'officiel que je peux insérer.

Merci.

EDIT: for arguments sake laisse juste supposer que nous voulons des jours fériés en Angleterre!!!!

18
demandé sur Richard J. Ross III 2009-01-19 13:34:07

23 réponses

je viens de recueillir des informations sur internet et je viens avec cette façon facile de calculer les jours fériés américains.


US les jours Fériés

===========================

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]
12
répondu Vonpato 2017-01-04 14:50:38

pour autant que je sache, il n'y a pas de source "officielle", et cela dépend en effet fortement de la localisation. Vous devez gérer manuellement. Une bonne source semble être:

http://en.wikipedia.org/wiki/List_of_holidays_by_country

Même dans ces circonstances, il est très difficile à gérer. Par exemple, je vis en Belgique, et différentes parties du pays ont des vacances différentes. Les travailleurs du gouvernement, par exemple, ont des congés différents de ceux des le reste de la main-d'œuvre, et c'est dans le même code régional.

8
répondu Robin 2009-01-19 10:39:59

un jour férié n'est-il pas très dépendant du lieu?

par programmation, il n'y a aucun moyen de calcul ceci. Alternativement, vous aurez besoin de trouver une liste officielle de vacances pour chacun de vos endroits. Et même ainsi, vous n'obtiendrez pas la granularité vous le souhaitez.

6
répondu Yuval Adam 2009-01-19 10:36:34

dans nos applications, il fait partie de la configuration de l'utilisateur. Il existe un endroit où les utilisateurs peuvent fixer ce qu'ils considèrent comme des jours fériés ou des jours fériés aussi loin dans l'avenir qu'ils le souhaitent. Pour la facilité d'utilisation il est possible de les copier à la date des années précédentes. Cela leur permet également de fixer des jours fériés "selon la coutume", peut-être un jour que l'entreprise traite comme un jour férié, mais qui n'est pas officiel au niveau national...

D'un point de vue programmatique, cependant, il n'y a absolument aucune hypothèse. C'est en fait juste une table de dates maintenue par l'utilisateur.

(Cela inclut le Royaume-Uni parce que, comme indiqué ci-dessus, certaines vacances varient et ne sont pas gravées dans le marbre, et parfois il y a des jours spéciaux uniques.)

5
répondu MatBailie 2009-01-19 10:47:54

jours fériés sont rarement disponibles pour les 50 prochaines années. Dans certains pays, ils sont connus pour les deux prochaines années, dans certains pays, pas. Ils varient également selon les états et les villes.

4
répondu cbp 2009-01-19 10:38:22
4
répondu GeekyMonkey 2009-01-19 11:32:15

vous pouvez utiliser le Nager.Bibliothèque de rendez-vous pour calculer les jours fériés. https://github.com/tinohager/Nager.Date

Nuget

PM> install-package Nager.Date

Exemple:

var publicHolidays = DateSystem.GetPublicHoliday(CountryCode.GB, 2017);
foreach (var publicHoliday in publicHolidays)
{
    var name = publicHoliday.LocalName;
}
3
répondu live2 2017-02-28 22:04:58

Ahhh, calendriers de vacances. Le fléau de la vie de tout programmeur de banque d'investissement. Il n'y a pas d'autre moyen de le faire que de maintenir votre propre liste, j'en ai peur!

2
répondu endian 2009-01-19 11:23:27

Vous allez avoir besoin de maintenir une table de fête pour cette. Pour une internationalisation appropriée, vous avez même besoin de maintenir quels jours sont des jours de week-end pour ceci puisque même cela n'est pas universel. De même, vous pourriez avoir besoin de maintenir des vacances par locale de sorte que votre programme sait que les utilisateurs à Londres ont le jour de congé, mais les utilisateurs en Turquie ne le font pas.

ceci doit être entièrement configurable par l'utilisateur. Pour autant que tu saches, l'anniversaire du propriétaire de la société pourrait être un jour de congé "standard". Essayer pour trouver de vacances sur le web.

enfin, vous ne voulez pas stocker 50 ans de données de vacances. Il ne sera qu'inexact et ralentira potentiellement tout votre code.

2
répondu jmucchiello 2009-01-19 13:05:18

pour beaucoup D'entre nous aux États-Unis, il existe une liste standard de jours fériés qui peuvent être calculés de façon déterministe.

en M'inspirant du code de Vonpato, j'ai assemblé une seule déclaration SQL qui utilise les fonctions de fenêtre ( over(partition by ..)), nouveau dans SQL Server 2008, pour déterminer la n'ème ou dernière occurrence d'un jour de semaine dans un mois.

ceci doit être exécuté avec "DimDate", une table de dimensions de Date standard telle que trouvée dans une donnée Entrepôt. 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
2
répondu Rob McCauley 2014-02-26 18:54:33

si C'est juste L'Angleterre, alors vous pouvez les régler vous-même! Vous aurez besoin d'un algorithme fiable pour déterminer Pâques, mais sinon je dirais que vous pourriez le faire en moins d'une heure.

mais voulez-vous dire seulement L'Angleterre, ou le Royaume-Uni? Parce que L'Ecosse a des vacances différentes (Noël, Hogmanay et St Andrew's Day) et L'Irlande Du Nord, le pays de Galles et très probablement L'Île de Man et les îles Anglo-Normandes devraient également être échangées différemment.

Comme indiqué ailleurs, une fois que votre champ d'application s'élargit alors c'est encore plus complexe. Il y a des jours fériés locaux, des demi-journées, des jours où les banques sont ouvertes mais pas les bourses, toutes sortes d'horreurs.

si vous ne pouvez vraiment pas gérer vos vacances vous-même et que vous n'avez pas d'utilisateurs à qui confier la responsabilité, alors je vous suggère de revenir à votre contrainte "ne peut pas courir un jour férié" et de chercher des moyens de la supprimer...

1
répondu Mike Woodhouse 2009-01-19 12:52:10

pour ceux qui ont de la difficulté à trouver le dernier jeudi de novembre pour Thanksgiving, je commence par trouver le dernier jour du mois puis utiliser une boucle WHILE() à moins un jour et vérifier le nom de la date jusqu'à ce que le nom de la date est jeudi:

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
1
répondu Rekwan 2014-07-28 23:23:07

en plus de permettre à l'utilisateur de configurer quels jours sont des jours fériés, il serait bien que vous permettiez à l'utilisateur de sélectionner un calendrier à importer ou même à souscrire. iCalShare a une belle liste. Cependant, c'est probablement trop de travail pour une fonctionnalité qui est simplement agréable.

0
répondu Knox 2009-01-19 11:23:57

pour ajouter ce que d'autres ont déjà dit, mettre le vôtre dans une table est la seule vraie façon de le faire. Un exemple classique est le jour férié supplémentaire pour le jubilé de la Reine. Cela a été annoncé un couple d'années à l'avance, et il n'y a aucun moyen que vous pourriez avoir cinquante ans à l'avance.

GoodBusinessDay.com mais je n'ai aucune expérience avec il.

0
répondu Nick Fortescue 2009-01-19 11:31:31

google calendrier public hollydays Peut-être pourriez-vous récupérer vos données de pays/région avec google Calendar web service.

0
répondu Luis Melgratti 2009-01-19 13:04:12

Trouvé un autre service pour le monde entier, les jours fériés, aurait utilisé par le calendrier des éditeurs:

http://www.qppstudio.net/index.htm

0
répondu Eliot Sykes 2009-06-01 09:19:21

cet algorithme peut réduire la quantité de configuration manuelle dans les pays qui observent les fêtes chrétiennes. Devrait être trivial pour convertir en C#:

http://en.wikipedia.org/wiki/Computus#Anonymous_Gregorian_algorithm

0
répondu JCCyC 2009-06-23 19:31:33

les institutions financières s'abonneront à des services qui fournissent des mises à jour périodiques des calendriers bancaires pour divers endroits.

notez qu'il y a souvent des différences entre les jours fériés bancaires et les jours fériés ordinaires. Un exemple de ceci aux États-Unis Est ce passé jour de L'Indépendance où le gouvernement fédéral a reconnu le jour férié le 3 juillet, mais la Banque de Réserve Fédérale de New York était ouverte.

2009 fédéral américain Vacances

2009 U. S. Federal Reserve Bank Holidays

0
répondu William Bell 2009-11-17 20:17:03

si cela peut aider, j'ai un fichier texte qui liste les règles pour calculer les jours fériés bancaires définis pour tous les centres financiers majeurs et mineurs. La façon habituelle de définir ceci est par centre d'affaires, comme à Londres, New York Francfort etc. etc, plutôt que par pays. Comme exemple, voici les règles et les explications pour Londres et quelques autres. Si quelqu'un veut le lot de tout laissez-moi savoir. Ce lot devrait fonctionner de 1990 à 2030 au plus tôt. Évidemment, il ne dispose d'aucune nouveaux jours fériés annoncé après la mise en place des fles (2006 je pense).

/*
 *   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,;
}
0
répondu LPL 2011-10-07 17:01:11

dans certains pays (C'est-à-dire en Pologne) le nombre de vacances s'approfondit à Pâques.

A la fin de ce post, vous pouvez trouver un code pour calculer la date de début et quelques jours fériés qui en dépendent.

jours fériés non mobiles, c'est-à-dire le 1er janvier, les jours fériés de Noël, Le Jour de L'indépendance, etc. peut être stocké quelque part dans la table.

gardez à l'esprit que dans le nombre de pays, vous avez des régions/états qui peuvent avoir des jours fériés supplémentaires, mais pour calculer tous les jours fériés pour votre pays ou votre région devrait être possible.

AU ROYAUME-UNI c'est-à-dire que vous avez des jours fériés qui ont des règles que vous pouvez utiliser dans votre code. - Le premier lundi de Mai - Dernier lundi de Mai - Dernier lundi d'août etc.

Veuillez consulter ce lien pour plus de détails http://en.wikipedia.org/wiki/Public_holidays_in_the_United_Kingdom

Comment calculer la date de Pâques dans 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 ''
0
répondu Wojciech Jakubas 2014-03-24 11:21:00

simplifions cela:


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
0
répondu user3417343 2015-03-18 16:13:26

jours Fériés au royaume-UNI sont pour la plupart calculable, mais certainement pas tous les calculable.

le gouvernement du Royaume-Uni fournit une API (https://www.gov.uk/bank-holidays.json) qui vous donne cette information.

0
répondu cherry 2015-11-04 08:51:30

je trouve ce sujet étrange. Après avoir essayé de trouver et d'écrire des fonctions compliquées dans MS, PHP ou dans ce cas SQL language je suis arrivé à la conclusion que c'est un exercice inutile. Le code que j'ai fini par contenir plus de 2000 caractères et prend des heures pour obtenir droit et de déboguer. Si vous y pensez tout ce que vous avez à faire est d'écrire 7 Nombre indiquant le jour 1-365 pour chaque jour férié et une rangée pour chaque année pour les 100 prochaines années. Vous n'avez besoin de charger que les années ou les prochaines vacances une fois. Afin de garder table avec 7 colonnes et 100 lignes et les remplir avec les bons jours. Vous n'avez besoin de faire cela une fois tous les 100 ans et prendre moins d'une heure et il est portable.

0
répondu Mehrdad Ordoukhani 2016-09-23 22:01:31