0

私はTSQL関数を持っています(私はSQL構文に強くありません)が呼び出されたときに週末を削除します:

ALTER FUNCTION dbo.fn_WorkDays (@StartDate AS DATETIME, @EndDate AS DATETIME)
--Define the output data type.
RETURNS INT
AS
--Calculate the RETURN of the function.
BEGIN
    RETURN (
     SELECT
        (DATEDIFF(dd,@StartDate, @EndDate)+1)--Start with total number of days including weekends +1 Includes the day run
        -(DATEDIFF(wk,@StartDate, @EndDate)*2)--Subtact 2 days for each full weekend
        -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' --If StartDate is a Sunday, Subtract 1
            THEN 1 
            ELSE 0 
        END) 
        -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday'--If EndDate is a Saturday, Subtract 1 
            THEN 1 
            ELSE 0 
        END))       
END

ただし、次のようなコードを使用してテーブルから取得できる既存の銀行休業日も削除したいと思います。

  SELECT COUNT([Date])
  FROM [InvoiceManagement].[dbo].[tblBankHolidays]
  WHERE [Date] BETWEEN '2006-04-14' AND '2006-05-29'--eventually replace dates with @StartDate, @EndDate 

INT を返す前に結果から既存のバンク ホールを差し引くように、上記の選択を関数にステッチすることは可能ですか? もしそうなら、私はTSQLに強くないので、その方法についてウォークスルーしていただければ幸いです

4

2 に答える 2

3

SQL Server 2008:

まず、休日用のテーブルを使用し、すべての休日 (#Saturdays & Sundays)を挿入します。

CREATE TABLE dbo.Holiday(HolidayDate DATE PRIMARY KEY);
GO
INSERT INTO dbo.Holiday(HolidayDate) VALUES ('2013-07-06'); -- Saturday
GO
INSERT INTO dbo.Holiday(HolidayDate) VALUES ('2013-07-07'); -- Sunday
GO
...

次に、2 つの日付間の営業日を取得するには、次のクエリを使用します。

DECLARE @StartDate DATE,@EndDate DATE;
SELECT  @StartDate='2013-07-01',
    @EndDate='2013-07-31';

SELECT  DATEDIFF(DAY,@StartDate,@EndDate) + 1 - COUNT(*) AS WorkingDaysCount
FROM    dbo.Holyday h
WHERE   h.HolidayDate BETWEEN @StartDate AND @EndDate;

注:DATENAME決定論的ではありません:

SET LANGUAGE english;
SELECT DATENAME(dw, '2013-08-01') AS DateNm_EN;
GO
SET LANGUAGE romanian;
SELECT DATENAME(dw, '2013-08-01') AS DateNm_RO;
GO

結果:

DateNm_EN
---------
Thursday

DateNm_RO
---------
joi

編集1:

USE [InvoiceManagement];
GO
CREATE FUNCTION dbo.fn_WorkDays_v2 (@StartDate AS DATE, @EndDate AS DATE) -- Arguments should have the same type as column's type
RETURNS INT
AS
BEGIN
    DECLARE @HolidaysCount INT;

    SELECT @HolidaysCount=COUNT(*)
    FROM [dbo].[tblBankHolidays] h
    WHERE h.[Date] BETWEEN @StartDate AND @EndDate;

    DECLARE @WeekendDaysCount INT;
    WITH N10(Num)
    AS
    (
        SELECT Num FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))  n(Num)
    ), N100(Num)
    AS
    (
        SELECT (a.Num-1)*10 + b.Num AS Num
        FROM N10 a CROSS JOIN N10 b
    ), N10000(Num)
    AS
    (
        SELECT (a.Num-1)*100 + b.Num AS Num
        FROM N100 a CROSS JOIN N100 b
    )
    SELECT @WeekendDaysCount=COUNT(*)
    FROM N10000 n
    WHERE DATEDIFF(DAY,@StartDate,@EndDate) >= n.Num
    AND DATEDIFF(DAY,0, DATEADD(DAY,n.Num-1,@StartDate)) % 7 IN (5,6); -- 5=Saturday, 6=Sunday

    RETURN (DATEDIFF(DAY,@StartDate, @EndDate)+1 - @HolidaysCount - @WeekendDaysCount);       
END
于 2013-08-01T10:23:40.217 に答える