我正在使用asp.net中的考勤软件,在其中我必须做一个报告,告诉用户有关时间和所有内容......到目前为止,我已经创建了系统的基本功能,即用户可以办理登机手续并退房...我被困在报告中......
我必须计算每个月的工作时间,因此用户可以将他的小时数与总小时数进行比较...我想到的是创建一个存储过程,当给出一个月份名称和一年时,返回一个int包含那个月的工作时间....但我似乎可以得到它......
到目前为止,我发现如何创建一个特定月份和日期的日期,并找出该月的最后一天,使用它我可以找出一个月的总天数...现在我似乎无法弄清楚我怎么知道减去工作日的天数。
这是目前为止的代码..
declare
@y int,
@m int,
@d int,
@date datetime
set @y = 2012
set @m = 01
set @d = 01
----To create the date first
select @date = dateadd(mm,(@y-1900)* 12 + @m - 1,0) + (@d-1)
----Last Day of that date
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@date)+1,0))
任何帮助都将受到赞赏,感谢提前....
答案 0 :(得分:1)
@theDate是您想要计算工作日的月份的任何日期。这种方法不关心假期。
DECLARE @theDate DATETIME = GETDATE()
SELECT MONTH(@theDate) [Month], 20 + COUNT(*) WorkDays
FROM (
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, @theDate), 28) AS theDate
UNION
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, @theDate), 29)
UNION
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, @theDate), 30)
) AS d
WHERE DATEPART(DAY, theDate) > 28
AND DATEDIFF(DAY, 0, theDate) % 7 < 5
答案 1 :(得分:0)
在这里你可以考虑下面的sql server代码来获取第一个和 在给定月份的最后一天,也忽略了所有星期六和星期日。
DECLARE @curr_date datetime=getdate()
DECLARE @st_date datetime,@ed_date datetime
select @st_date=DATEADD(mm,datediff(mm,0,@curr_date),0),@ed_date = DATEADD(mm,datediff(mm,-1,@curr_date),-1)
--select @st_date as first_day,@ed_date as last_day
SET DATEFIRST 1 --Monday as first day of week
select DATEADD(dd,number,@st_date) from master..spt_values
where DATEDIFF(dd,DATEADD(dd,number,@st_date),@ed_date) >= 0 and type='P'
and DATEPART(DW,DATEADD(dd,number,@st_date)) <> 6
and DATEPART(DW,DATEADD(dd,number,@st_date)) <> 7
But inorder to calculate the actual working hours, you will have to take into the consideration of following thigs
1.Calculate the time interval between swipe-in and swipe-outs between start and end time for a day.
2.Exclude all the time gap(employee not in office)
3.Consider the company holidays.
etc
答案 2 :(得分:0)
这是一个计算工作日的UDF。您可以将一个月的任何日期传递给此功能。但通常您应该使用实际的“日历”表来计算工作日,并在此表中插入周末,节假日......等等。
CREATE FUNCTION dbo.WorkDaysCount (@Date datetime)
RETURNS int AS
BEGIN
DECLARE @BeginOfMonth datetime
SET @BeginOfMonth=DATEADD(DAY,-DAY(@Date)+1,@Date);
DECLARE @EndOfMonth datetime
SET @EndOfMonth=DATEADD(Day,-1,DATEADD(Month,1,@BeginOfMonth));
DECLARE @cDate datetime
set @cDate=@BeginOfMonth
Declare @WorkDaysCount int
SET @WorkDaysCount=0
while @cDate<=@EndOfMonth
begin
if DATEPART(dw,@cDate) not in (1,7) SET @WorkDaysCount=@WorkDaysCount+1 -- not a Sunday or Saturday change (1,7) to (6,7) if you have other week start day (Monday).
set @cDate=@cDate+1;
end;
return (@WorkDaysCount);
END