我为此编写了一个函数,该函数运行良好,但如果员工在月中或上周加入,那么存在一个问题,那么如何计算他/她的每周假期。
目前以下功能可以获取他/她一个月内的所有假期。
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”
月中加入员工的功能我添加了一个新参数`@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;