Как определить выходной день на сервере Sql? - PullRequest
18 голосов
/ 19 января 2009

У меня есть приложение, написанное на c #, которое не может быть запущено в праздничные или выходные дни. Я немного осмотрелся и не нашел нигде (официального), которое бы обеспечивало все праздничные дни на ближайшие, скажем, 50 лет.

Если я смогу получить их, я просто массово вставлю их в таблицу праздничных дней на сервере sql и использую их. Однако я нигде не могу найти эти данные.

Кто-нибудь знает, есть ли на сервере Sql какая-либо поддержка государственных праздников или какой-то алгоритм для их решения? Или у кого-нибудь есть официальные данные, с которых я могу сделать массовую вставку.

Ответы [ 23 ]

1 голос
/ 29 июля 2014

Для тех, у кого возникают проблемы с поиском последнего четверга ноября на День Благодарения, я начинаю с нахождения последнего дня месяца, затем использую цикл WHILE (), чтобы минус день, и проверяю имя даты, пока оно не станет четвергом:

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 голос
/ 19 января 2009

Если это просто Англия, то вы можете решить их сами! Вам понадобится надежный алгоритм определения Пасхи, но в противном случае я бы сказал, что вы можете сделать это менее чем за час.

Но вы имеете в виду только Англию или Великобританию? Поскольку в Шотландии разные праздники (Рождество, Хогманай и Андреевский день) и Северная Ирландия, Уэльс и, скорее всего, остров Мэн и Нормандские острова также должны торговаться по-разному.

Как отмечалось в другом месте, как только ваша сфера применения становится шире, она становится еще более сложной. Есть местные праздники, полдня, дни, когда банки открыты, а биржи нет, всевозможные ужасы.

Если вы действительно не можете сами управлять выходными и у вас нет пользователей, на которых может быть возложена ответственность, тогда я бы предложил вернуться к вашему ограничению «не работать в праздничные дни» и искать способы, которыми это может быть удалено ...

0 голосов
/ 01 июня 2009

Найден еще один сервис для всемирных государственных праздников, предположительно используемый издателями календаря:

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

0 голосов
/ 24 сентября 2016

Я нахожу эту тему странной. После попыток найти и написать сложные функции на MS, PHP или, в данном случае, на языке SQL, я пришел к выводу, что это бессмысленное упражнение. Код, который я получил, содержит более 2000 символов, и на его отладку уйдут часы. Если вы думаете об этом, все, что вам нужно сделать, это написать 7 число с указанием дня 1-365 для каждого праздника и строку для каждого года в течение следующих 100 лет. Вам нужно только один раз загрузить этот год или следующий год. Так что держите таблицу с 7 столбцами и 100 строками и заполните их правильными днями. Вам нужно делать это только раз в 100 лет, и это займет не более часа, и это портативно.

0 голосов
/ 04 ноября 2015

Праздничные дни в Великобритании в основном вычисляются, но определенно не все вычисляются.

Правительство Великобритании предоставляет API (https://www.gov.uk/bank-holidays.json), который предоставляет вам эту информацию.

0 голосов
/ 24 марта 2014

В некоторых странах (например, в Польше) число праздников на Пасху увеличивается.

В конце этого поста вы можете найти код для расчета даты едока и нескольких праздников, которые зависят от него.

Неподвижные праздники, т. Е. 1 января, рождественские праздники, День независимости и т. Д., Могут храниться где-то в таблице.

Имейте в виду, что в ряде стран у вас есть регионы / штаты, в которых могут быть дополнительные праздничные дни, но можно рассчитать все выходные дни для вашей страны или региона.

В Великобритании, т.е. у вас есть праздничные дни, в которых есть некоторые правила, которые вы можете использовать в своем коде. - Первый понедельник мая - последний понедельник мая - последний понедельник августа и т. Д.

Пожалуйста, проверьте эту ссылку для более подробной информации http://en.wikipedia.org/wiki/Public_holidays_in_the_United_Kingdom

Как рассчитать дату Пасхи в 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 голосов
/ 19 марта 2014

Давайте упростим это:


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 голосов
/ 17 ноября 2009

Финансовые учреждения будут подписываться на услуги, которые предоставляют периодические обновления банковских календарей для различных регионов.

Обратите внимание, что между банковскими и обычными выходными часто бывают различия. Примером этого в Соединенных Штатах является прошедший День независимости, когда федеральное правительство признало праздник 3 июля, но Федеральный резервный банк Нью-Йорка был открыт.

2009 Федеральные праздники США

2009 Федеральный резервный банк США, праздничные дни

0 голосов
/ 23 июня 2009

Этот алгоритм может уменьшить количество ручной настройки в странах, где отмечаются христианские праздники. Преобразовать в C # должно быть тривиально:

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

0 голосов
/ 02 июня 2009

Если это поможет, у меня есть текстовый файл, в котором перечислены правила расчета банковских выходных, определенные для всех основных и второстепенных финансовых центров. Обычный способ определения этого - по бизнес-центру, как в Лондоне, Нью-Йорке, Франкфурте и т. Д., А не по стране. В качестве примера приведем правила и пояснения для Лондона и некоторых других. Если кто-то хочет всего этого, дайте мне знать. Эта партия должна работать с 1990 по 2030 год. Очевидно, что не будет объявлено ни одного нового праздника после того, как будут собраны фары (думаю, 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,;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...