Web design and hosting, database, cloud and social media solutions that deliver business results
  • Obchodní řešení
    • Databázové služby
      • Integrace dat
    • Robotická automatizace procesů
    • Návrh webových stránek
      • Zabezpečení webových stránek
    • Obchodní služby
      • Microsoft Azure
    • Microsoft Office
    • Sociální Média
  • Akademie
    • Výuka návrhu databáze
      • Zprávy
      • Pomocí serveru SQL Pivot-Unpivot
      • Použití dat serveru SQL Server
      • Používání funkcí dat serveru SQL Server
      • Používání funkcí serveru SQL Server
      • SQL Server 2008 plán údržby
    • Výuka designu webových stránek
      • CSS
      • ASP NET
  • O nás
    • Portfolio
    • tým
      • Gavin Clayton
      • Chester Copperpot
      • Suneel Kumar
عربى (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)

Přidejte pracovní dny k datu ve funkci serveru SQL s flexibilními možnostmi

Flexibilní a opakovaně použitelná funkce serveru SQL, která k datu přidá počet dní s možností vyloučit svátky nebo víkendy
Using SQL Server Date Functions

Pokud jste si rezervovali další články s daty, možná již máte tabulku, pokud ne, použijte ji k vytvoření níže uvedeného kódu.

Jsou založeny na standardních svátcích v Anglii a Walesu.

Na hlavní stránce jsou funkce pro jiné země.

ještě: Použití dat serveru SQL Server
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

Nyní máme data, můžeme vytvořit funkci, která prochází každým dnem od začátku do konce a přidá 1 na @Count, kde to není sobota, neděle nebo ve vaší databázi prázdninových dnů.

Měli jsme určitou zpětnou vazbu, že předchozí funkce by mohla být flexibilnější, a kvůli opětovným potřebám klienta jsme toto aktualizovali o další možnosti:

  • @AdjustDate - datum, které chcete změnit
  • @CalenderFunction - Dovolená funkce, kterou chcete použít (některé země ve Velké Británii mají různá data, takže je můžeme ukládat do různých funkcí)
  • @AdjustDats - počet dní, které se mají přidat nebo odebrat od základního data
  • @AdjustMode - 0 pro dny přidání, 1 pro dny odpočtu
  • @AdjustWeekend - Vyloučí víkendy z vašich výpočtů
  • @AdjustHátky - Vyloučí svátky, pokud se funkce dovolené shoduje

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 Cookie Policymapa stránek

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
Nastavení na této stránce jsou nastaveny povolit všechny soubory cookie. Ty mohou být změněny na našich zásad a nastavení stránky cookie. Nadále používat tento web souhlasíte s použitím cookies.
Ousia Logo
Logout
Ousia CMS Loader