0

人事の役割を格納する SQL Server にタイムシート テーブルがあります。

CREATE TABLE [dbo].[TimeSheetTable](
[pk_TimeSheetID] [bigint] IDENTITY(1,1) NOT NULL,
[fk_PersonelID] [int] NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NOT NULL,
[fk_RoleID] [int] NOT NULL,
[Comments] [nvarchar](2000) NULL,
[dateCreated] [datetime] NOT NULL,
[CreatedBy] [int] NULL,

場合によっては、従業員が 2012 年 10 月 28 日から 2012 年 11 月 2 日まで、月が重複して休暇を取ることがあります。上記の例では、従業員は 10 月に 4 日、11 月に 3 日ありました。

私の問題は、それぞれの休暇の日数をカウントするクエリを作成することです。終了日が月を超える場合、それはカウントされません。

SELECT TOP 1000 
  sum(DATEDIFF(day,startdate,EndDate))
FROM [db_ASCO_Personel].[dbo].[TimeSheetTable]
where fk_RoleID=51  /* how do I count leave days that over lap between two months*/

行番号 17 には、11 月に 1 日、12 月に 2 日 (合計 3 日間の休暇) があります。各従業員が 1 か月だけ取得した休暇の日数をどのように数えますか?

TimeSheetID StartDate EndDate RoleID コメント dateCreated CreatedBy

15 2012 年 8 月 6 日 2012 年 8 月 7 日 51 03:10.6 NULL 16 2012 年 8 月 1 日 2012 年 8 月 2 日 51 03:31.5 NULL 17 2012 年 11 月 29 日 2012 年 12 月 3 日 51 51:15.5 NULL

4

2 に答える 2

0

データを取得して c# で計算し、新しいテーブルに入れます (または、値に対して必要なことは何でも行います)。

ただし、休暇時間が丸 1 か月を超えることはないと確信できる場合(たとえば、開始日が 1 月で、終了日が 2 月よりも遅くなることはない)、それ以外の場合はいくつかのことを行うことができます。

SELECT TOP 1000 CASE 
                  WHEN month(startDate) = month(enddate)
                     THEN sum(DATEDIFF(day,startdate,EndDate)) as daymonth1, 0 as daysmonth2
                  ELSE  sum(DATEDIFF(day,startdate,EndDate)) - day(enddate) as daymonth1,day(enddate) as daysmonth2 
                END
FROM [db_ASCO_Personel].[dbo].[TimeSheetTable]
where fk_RoleID=51

完全にテストするために、このコンプにssmsがないため、その構文を確認してください

編集:powagaへ:私が愚かでない限り、彼はそうしました(はっきりとは言えませんが)、彼は7ではなく4と3を返したいと言っていました...彼は結果の日数を日数ではなく1か月あたりにしたいと考えています

于 2012-12-06T21:10:15.123 に答える
0

月の始まりと終わりを知る必要があります。このようなもの:

with const as (
    select cast('2012-09-01' as date) as MonthStart, cast('2012-09-30' as date) as MonthEnd
   )
select sum(DATEDIFF(day,
                    (case when startdate < const.MonthStart then const.MonthStart else startdate end), 
                    (case when enddate > const.MonthEnd then const.MontEnd else ndDate end)
          )
FROM [db_ASCO_Personel].[dbo].[TimeSheetTable] tst cross join
     const
where fk_RoleID=51 and
      startdate <= const.MonthEnd and
      enddate >= const.MonthStart
于 2012-12-06T21:10:50.857 に答える