1

私はasp.netで出席ソフトウェアに取り組んでいます。その中で、時間とすべてについてユーザーに通知するレポートを作成する必要があります...これまでのところ、システムの基本機能を作成しました。つまり、ユーザーは確認できますインしてチェックアウト... レポートを作成するのに行き詰まっています...

毎月の労働時間を計算する必要があるため、ユーザーは自分の時間を合計時間と比較できます...私が念頭に置いていたのは、月の名前と年を指定すると、intを含む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))

どんな助けでも大歓迎です、前もって感謝します....

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

これが就業日数をカウントする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 に答える
0

ここでは、以下の SQL サーバー コードを検討して、特定の月の最初と最後の日を取得し、すべての土曜日と日曜日を無視することもできます。

    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 に答える