1

我正在使用 asp.net 中的考勤软件,在其中我必须制作一份报告,告诉用户时间和一切......到目前为止,我已经创建了系统的基本功能,即用户可以检查进去看看……我一直在做报告……

我必须计算每个月的工作时间,以便用户可以将他的小时数与总小时数进行比较......我的想法是创建一个存储过程,当给定月份名称和年份时,返回一个包含那个月的工作时间....但我似乎可以做到....

到目前为止,我发现了如何从给定的月份和日期创建日期,并找出了该月的最后一天,使用它我可以找出月份的总天数......现在我似乎无法弄清楚如何我知道要减去多少天才能获得工作日吗?

这是到目前为止的代码..

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))

任何帮助将不胜感激,在此先感谢....

4

3 回答 3

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
于 2012-08-02T09:00:29.000 回答
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
于 2012-08-02T09:15:39.000 回答
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
于 2012-08-03T05:56:43.190 回答