Web design and hosting, database, cloud and social media solutions that deliver business results
  • Rozwiązania biznesowe
    • Oprogramowanie
    • Projektowanie stron
      • Bezpieczeństwo witryny
      • Lokalizacja i tłumaczenie stron internetowych
    • Usługi baz danych
      • Integracja danych
      • Przybory
    • Zrobotyzowana automatyzacja procesów
    • Usługi biznesowe
      • Microsoft Azure
    • Media Społecznościowe
    • Microsoft Office
  • Akademia
    • Nasze środowisko testowe
    • Nauka projektowania baz danych
      • Używanie funkcji datownika SQL Server
      • SQL Server 2008 planu konserwacji
      • Korzystanie z funkcji serwera SQL Server
      • Korzystanie z programu SQL Server Pivot-Unpivot
      • Używanie dat serwera SQL
    • Nauka projektowania stron internetowych
      • CSS
      • ASP-NET
      • Korzystanie z JavaScript
    • Nauka w chmurze i usługi IT
      • Błąd harmonogramu zadań 2147943645
      • Żądanie SSL i generowanie pliku PFX w OpenSSL Simple Steps
  • O
    • Portfel Pracy
    • Zespół
      • Adrian Anandan
      • Ali Al Amine
      • Ayse Hur
      • Chester Copperpot
      • Gavin Clayton
      • Sai Gangu
      • Suneel Kumar
      • Surya Mukkamala
عربى (AR)čeština (CS)Deutsch (DE)English (EN-US)English (EN-GB)Español (ES)فارسی (FA)Français (FR)हिंदी (HI)italiano (IT)日本語 (JA)polski (PL)Português (PT)русский (RU)Türk (TR)中国的 (ZH)

Dodaj do tej pory dni robocze w Funkcji SQL Server z elastycznymi opcjami

Elastyczna i wielokrotnego użytku funkcja SQL Server, która doda liczbę dni do daty z opcją wykluczenia świąt lub weekendów
Using SQL Server Date Functions

Jeśli sprawdziłeś inne artykuły z datą, być może masz już tabelę, jeśli nie, użyj poniższego kodu, aby ją utworzyć.

Opierają się one na standardowych świętach w Anglii i Walii.

Na stronie głównej są funkcje dla innych krajów.

dalszy: Używanie dat serwera SQL
CREATE TABLE Dates.Calendar(
CalendarDate DATETIME2 NOT NULL CONSTRAINT PK_CalendarDate PRIMARY KEY,
CalendarCA AS (DATEDIFF(DAY,DATEADD(DAY,1-DATEPART(DAY,CalendarDate),CalendarDate),CalendarDate)/7)+1 PERSISTED,
CalendarCD AS (DATEDIFF(DAY,CalendarDate,DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(DAY,1-DATEPART(DAY,CalendarDate),CalendarDate))))/7)+1 PERSISTED,
WeekDayID AS (DATEPART(weekday,[CalendarDate])),
WeekDayName AS (case DATEPART(weekday,[CalendarDate]) when (1) then 'Sunday' when (2) then 'Monday' when (3) then 'Tuesday' when (4) then 'Wednesday' when (5) then 'Thursday' when (6) then 'Friday' when (7) then 'Saturday'  end))
GO
DECLARE @D DATETIME2='1850-01-01'
WHILE @D<='2099-12-31' BEGIN
INSERT INTO Dates.Calendar(CalendarDate) SELECT @D
SET @D=DATEADD(DAY,1,@D)
END
GO
CREATE TABLE Dates.CalendarHolidays(CalendarDate DATETIME2 NOT NULL,CalendarFunction INT NOT NULL,HolidayType VARCHAR(100) NULL,CONSTRAINT PK_Holidays_Id PRIMARY KEY(CalendarDate,CalendarFunction))
GO
/*English & Welsh Holidays*/
INSERT INTO Dates.CalendarHolidays
SELECT CalendarDate,0,'New Years Day' FROM Dates.Calendar WHERE DATEPART(MONTH,CalendarDate)=1 AND DATEPART(DAY,CalendarDate)=1 UNION --New Years Day
SELECT CalendarDate,0,'Good Friday' FROM Dates.Calendar WHERE CalendarDate=DATEADD(DAY,-2,Dates.GetEasterDate(DATEPART(YEAR,CalendarDate))) UNION--Good Friday
SELECT CalendarDate,0,'Easter Monday' FROM Dates.Calendar WHERE CalendarDate=DATEADD(DAY,1,Dates.GetEasterDate(DATEPART(YEAR,CalendarDate))) UNION--Easter Monday
SELECT CalendarDate,0,'May Holidays' FROM Dates.Calendar WHERE DATEPART(MONTH,CalendarDate)=5 AND WeekDayID=2 AND (CalendarCA=1 OR CalendarCD=1)UNION--May Holidays
SELECT CalendarDate,0,'August Holidays' FROM Dates.Calendar WHERE DATEPART(MONTH,CalendarDate)=8 AND WeekDayID=2 AND (CalendarCD=1) UNION--August Holidays
SELECT CalendarDate,0,'Christmas Day' FROM Dates.Calendar WHERE DATEPART(MONTH,CalendarDate)=12 AND DATEPART(DAY,CalendarDate)=25 UNION --Christmas Day
SELECT CalendarDate,0,'Boxing Day' FROM Dates.Calendar WHERE DATEPART(MONTH,CalendarDate)=12 AND DATEPART(DAY,CalendarDate)=26 --Boxing Day
GO

Teraz, gdy mamy dane, możemy stworzyć funkcję, która zapętla się każdego dnia od początku do końca i dodaje 1 do @Count, gdzie nie jest to sobota, niedziela ani baza danych dni świątecznych.

Otrzymaliśmy informację zwrotną, że poprzednia funkcja może być elastyczna, i ponownie odwiedziliśmy niektóre dodatkowe potrzeby klientów, zaktualizowaliśmy ją o więcej opcji:

  • @AdjustDate - data, którą chcesz zmienić
  • @CalenderFunction - Funkcja wakacyjna, z której chcesz korzystać (niektóre kraje w Wielkiej Brytanii mają różne daty, więc możemy przechowywać je w różnych funkcjach)
  • @AdjustDats - liczba dni, które należy dodać lub usunąć z daty bazowej
  • @AdjustMode - 0 dla dni dodawania, 1 dla dni odejmowania
  • @AdjustWeekend - wyklucza weekendy z obliczeń
  • @AdjustHolidays - nie obejmuje wakacji, jeśli funkcja wakacji jest dopasowana

CREATE FUNCTION Dates.GetDateAdjusted(@AdjustDate AS DATETIME2,@CalendarFunction INT,@AdjustDays AS INT,@AdjustMode BIT,@AdjustWeekEnds BIT,@AdjustHolidays BIT) RETURNS DATETIME2 AS BEGIN
SELECT @AdjustDate=DATEADD(DAY,(CASE @AdjustMode WHEN 0 THEN -1 ELSE 1 END),@AdjustDate),
@AdjustDays=(CASE @AdjustMode WHEN 0 THEN @AdjustDays+1 ELSE (0-@AdjustDays)-1 END)
DECLARE @AdjustCount INT=0,@AdjustWorkDays INT=0,@Date DATETIME2=@AdjustDate
/*Add Days*/
WHILE @AdjustMode=0 AND @AdjustWorkDays < @AdjustDays
BEGIN
 SET @AdjustCount=@AdjustCount+1
 SET @Date=DATEADD(DAY,@AdjustCount,@AdjustDate)
 IF NOT ((DATEPART(WEEKDAY,@Date) IN (1,7) AND @AdjustWeekEnds=1)
 OR
 EXISTS (SELECT * FROM Dates.CalendarHolidays WHERE CalendarDate=@Date AND CalendarFunction=@CalendarFunction AND @AdjustHolidays=1))
 BEGIN
  SET @AdjustWorkDays = @AdjustWorkDays + 1
 END
END
/*Subtract Days*/
WHILE @AdjustMode=1 AND @AdjustWorkDays > @AdjustDays
BEGIN
 SET @AdjustCount=@AdjustCount-1            
 SET @Date=DATEADD(DAY,@AdjustCount,@AdjustDate)
 IF NOT ((DATEPART(WEEKDAY,@Date) IN (1,7)AND @AdjustWeekEnds=1)
 OR
 EXISTS (SELECT * FROM Dates.CalendarHolidays WHERE CalendarDate=@Date AND CalendarFunction=@CalendarFunction AND @AdjustHolidays=1))
 BEGIN
  SET @AdjustWorkDays = @AdjustWorkDays - 1
 END
END            
RETURN @Date            
END            
GO
SELECT Dates.GetDateAdjusted('2014-05-01',0,1,0,1,1)--'2014-05-02' 
SELECT Dates.GetDateAdjusted('2014-05-01',0,2,0,0,0)--'2014-05-03' 
SELECT Dates.GetDateAdjusted('2014-05-01',0,2,0,1,1)--'2014-05-06' 
SELECT Dates.GetDateAdjusted('2014-05-01',0,3,0,1,1)--'2014-05-07' 
SELECT Dates.GetDateAdjusted('2014-05-01',0,4,0,1,1)--'2014-05-08' 
SELECT Dates.GetDateAdjusted('2014-05-01',0,5,0,1,1)--'2014-05-09' 
SELECT Dates.GetDateAdjusted('2014-05-01',0,6,0,1,1)--'2014-05-12'

Author

Was this helpful?

Please note, this commenting system is still in final testing.
Copyright Claytabase Ltd 2020

Registered in England and Wales 08985867

RSSLoginLink Polityka Cookiemapa strony

Social Media

facebook.com/Claytabaseinstagram.com/claytabase/twitter.com/Claytabaselinkedin.com/company/claytabase-ltd

Get in Touch

+442392064871info@claytabase.comClaytabase Ltd, Unit 3d, Rink Road Industrial Estate, PO33 2LT, United Kingdom
Ustawienia na tej stronie są ustawione tak, że wszystkie pliki cookie. Mogą one być zmieniane na naszej polityki i ustawień strony z ciasteczkami. Dalsze korzystanie z tej strony, wyrażasz zgodę na korzystanie z plików cookie.
Ousia Logo
Logout
Ousia CMS Loader