计算一个月的工作时间

时间:2012-08-02 08:43:20

标签: sql sql-server-2008

我正在使用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))

任何帮助都将受到赞赏,感谢提前....

3 个答案:

答案 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