如何计算员工一个月内的周休

问题描述 投票:0回答:1

我为此编写了一个函数,该函数运行良好,但如果员工在月中或上周加入,那么存在一个问题,那么如何计算他/她的每周假期。

目前以下功能可以获取他/她一个月内的所有假期。

GO
/****** Object:  UserDefinedFunction [dbo].[GetTotalWeekHoliday]    Script Date: 1/23/2024 12:12:04 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[GetTotalWeekHoliday]
    (
        @Month AS nvarchar(10), -- parameter a
        @date AS date, -- parameter b
        @count1 AS INT,
        @HolidayName AS nvarchar(50),
        @year AS nvarchar(10)
    )
    RETURNS INT -- return type
    AS
    BEGIN
    set @date=@year+'-'+@Month+'-'+'01'
    while DATEPART(Month,@date)=@Month
Begin
    --Select DATEPART(DAY,@date);
    --Select DATEPART( WEEKDAY, @DATE )
    DECLARE @Name VARCHAR(20)

    SELECT  @Name = CASE ( DATEPART(dw, @Date) + @@DATEFIRST ) % 7
                         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 0 THEN 'Saturday'
                       END 
    If @Name=@HolidayName
    Begin
        
        --Insert Data Into Your Table
        set @count1+=1
    End
    
    Set @date=DATEADD(Day,1,@date); 
End
        RETURN @count1 -- return statement
    END;

示例 这个月 雇员1假期名称='星期二' 结果将为“5” 但如果雇员 1 于 1 月 20 日被任命 然后我想显示结果“2” 目前它显示全部“5”

sql-server t-sql sql-server-2012-express
1个回答
0
投票

月中加入员工的功能我添加了一个新参数`@JoiningDate,以指定他们的开始日期。该函数的循环现在包含一项检查,以确保它仅计算此加入日期当天或之后的假期。此外,该函数在内部确定给定月份的第一天

ALTER FUNCTION [dbo].[GetTotalWeekHoliday]
(
    ...
    @JoiningDate AS date  -- New parameter for employee's joining date
    ...
)
...
BEGIN
    ...
    while DATEPART(Month, @date) = CONVERT(int, @Month) AND @date <= EOMONTH(@date)
    BEGIN
        ...
        -- Check if the date is a holiday and is on or after the joining date
        IF @DayName = @HolidayName AND @date >= @JoiningDate
        BEGIN
            set @count1 += 1
        END
        ...
    END
    ...
END;
© www.soinside.com 2019 - 2024. All rights reserved.