0

次のようなユーザーの入力時間の表があります。

テーブル名は timebilling です:

田畑 :

 TimeBillingId  int
 UserId         int
 StartTime      datetime
 StopTime       datetime
 ElapsedTime    time(7)
 NormalTime     time(7)
 OverTime       time(7)

ここで、すべてのユーザーの合計時間を計算するレポートが必要です。Total ElapsedTime と同様に、月ごとの合計通常時間と合計残業時間です。

しかし、私の月は15日から15日です。だから私は結果が次のようになることを望みます:

User    Month        TotalTime         NormalTime       OverTime
 1     March-April   120:58:00         100:58:00        20:00:00
 2     March-April    97:40:23          97:40:23        00:00:00
 1     April-May      15:00:00          14:30:00        00:30:00
 2     April-May      89:30:00          80:15:00        09:15:00

このクエリを使用して、月ごとに機能させています。

select MONTH(tym.StopTIme) as Month, YEAR(tym.StopTime) as Year, U.UserId,
ISNULL((select cast(sum(datediff(second,0,t.ElapsedTime))/3600 as varchar(20)) + ':' + right('0' + cast(sum(datediff(second,0,t.ElapsedTime))/60%60 as varchar(20)),2) + ':' + right('0' + cast(sum(datediff(second,0,t.ElapsedTime))%60 as varchar(20)),2) 
from TimeBilling t where MONTH(t.StopTime) = MONTH(tym.StopTime) and YEAR(t.StopTime) = YEAR(tym.StopTime) and t.UserId = u.UserId),'00:00:00') as TotalTime,

ISNULL((select cast(sum(datediff(second,0,t.NormalTime))/3600 as varchar(20)) + ':' + right('0' + cast(sum(datediff(second,0,t.NormalTime))/60%60 as varchar(20)),2) + ':' + right('0' + cast(sum(datediff(second,0,t.NormalTime))%60 as varchar(20)),2) 
from TimeBilling t where MONTH(t.StopTime) = MONTH(tym.StopTime) and YEAR(t.StopTime) = YEAR(tym.StopTime) and t.UserId = u.UserId),'00:00:00') as NormalTime,

ISNULL((select cast(sum(datediff(second,0,t.OverTime))/3600 as varchar(20)) + ':' + right('0' + cast(sum(datediff(second,0,t.OverTime))/60%60 as varchar(20)),2) + ':' + right('0' + cast(sum(datediff(second,0,t.OverTime))%60 as varchar(20)),2) 
from TimeBilling t where MONTH(t.StopTime) = MONTH(tym.StopTime) and YEAR(t.StopTime) = YEAR(tym.StopTime) and t.UserId = u.UserId),'00:00:00') as OverTime 
from TimeBilling tym, Users u
where tym.UserId = u.UserId

1日から30日/31日のように、月ごとに合計時間を取得しました。しかし、私は15日から15日になりたいです。しかし、SQLクエリまたはストアドプロシージャで取得する方法がわかりません。

誰でも私を助けてくれますか?

4

3 に答える 3

0

最も簡単な方法は、カレンダー テーブルを使用することです。

http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

次のように、DatePart と DateName を使用して代替メソッドを構築できます。

DECLARE @dt DATE = '20130411'
--GETDATE() 

;
WITH    c AS ( SELECT   enddate = DATEADD(MONTH,
                                          CASE WHEN DAY(@dt) >= 16 THEN 1
                                               ELSE 0
                                          END,
                                          DATEADD(MONTH,
                                                  DATEDIFF(MONTH, 0, @dt), 0))
             )
    SELECT  DATENAME(MONTH, DATEADD(MONTH, -1, enddate)) + '-'
            + DATENAME(MONTH, enddate)
    FROM    c
于 2013-09-03T23:45:57.063 に答える