Sql 根据两个日期之间的周/年计算加班费

Sql 根据两个日期之间的周/年计算加班费,sql,sql-server,Sql,Sql Server,我们一个月付两次钱。。支付期为第1-15和第16个EOM。因此,支付期的结束可以在任何一天结束 我们在周一至周日加班40小时以上 如果发薪期在周六结束,员工有47小时,我们在该支票上支付7小时。。如果员工在周日工作,现在一周的总小时数是52。。我们将在他们的下一张支票上支付5个小时。。现在这是一个人工计算过程 我正努力思考如何写一个查询来获得额外的结转成本 这是我上一个发薪期(2019年9月1日至2019年9月15日)以及第一个发薪期(周日)的每日工作总产出。。我需要计算2019年8月26日起一

我们一个月付两次钱。。支付期为第1-15和第16个EOM。因此,支付期的结束可以在任何一天结束

我们在周一至周日加班40小时以上

如果发薪期在周六结束,员工有47小时,我们在该支票上支付7小时。。如果员工在周日工作,现在一周的总小时数是52。。我们将在他们的下一张支票上支付5个小时。。现在这是一个人工计算过程

我正努力思考如何写一个查询来获得额外的结转成本

这是我上一个发薪期(2019年9月1日至2019年9月15日)以及第一个发薪期(周日)的每日工作总产出。。我需要计算2019年8月26日起一周的加班费。对于这个特殊的员工,他周末随叫随到。他在2019年8月16日至2019年8月31日期间获得6.28小时的加班费,并在2019年9月1日额外工作了两个小时,因此需要将2小时加班费转入2019年9月1日至2019年9月15日的检查

ID小时每周CDATE
STU02 8.16 35 2019-08-26 00:00:00.000
STU02 9.37 35 2019-08-27 00:00:00.000
STU02 9.07 35 2019-08-28 00:00:00.000
STU02 7.91 35 2019-08-29 00:00:00.000
STU02 9.12 35 2019-08-30 00:00:00.000
STU02 2.65 35 2019-08-31 00:00:00.000
STU02 2.00 35 2019-09-01 00:00:00.000
STU02 4.17 36 2019-09-02 00:00:00.000
STU02 9.40 36 2019-09-03 00:00:00.000
STU02 8.8036 2019-09-04 00:00:00.000
STU02 8.9036 2019-09-05 00:00:00.000
STU02 8.93 36 2019-09-06 00:00:00.000
STU02 2.56 36 2019-09-07 00:00:00.000
STU02 2.00 36 2019-09-08 00:00:00.000
STU02 8.66 37 2019-09-09 00:00:00.000
STU02 9.1437 2019-09-10 00:00:00.000
STU02 9.07 37 2019-09-11 00:00:00.000
STU02 9.29 37 2019-09-12 00:00:00.000
STU02 9.9437 2019-09-13 00:00:00.000
STU02 2.00 37 2019-09-15 00:00:00.000

我感谢任何帮助,这一次我尝试了很多不同的东西,让我发疯

**使用表和数据更新**

/****** Object:  Table [dbo].[DLI_TEST_DATE]    Script Date: 9/18/2019 3:50:50 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[DLI_TEST_DATE](
    [EMPLOYEE_ID] [nvarchar](15) NULL,
    [REG_TOTAL] [float] NULL,
    [WEEK_NUM] [int] NULL,
    [CDATE] [datetime] NULL,
    [DAYOFWK] [int] NULL
) ON [PRIMARY]

GO

INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 2, 35, CAST(N'2019-08-25 00:00:00.000' AS DateTime), 1)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 8.16, 35, CAST(N'2019-08-26 00:00:00.000' AS DateTime), 2)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 9.37, 35, CAST(N'2019-08-27 00:00:00.000' AS DateTime), 3)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 9.07, 35, CAST(N'2019-08-28 00:00:00.000' AS DateTime), 4)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 7.91, 35, CAST(N'2019-08-29 00:00:00.000' AS DateTime), 5)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 9.12, 35, CAST(N'2019-08-30 00:00:00.000' AS DateTime), 6)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 2.65, 35, CAST(N'2019-08-31 00:00:00.000' AS DateTime), 7)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 2, 36, CAST(N'2019-09-01 00:00:00.000' AS DateTime), 1)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 4.17, 36, CAST(N'2019-09-02 00:00:00.000' AS DateTime), 2)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 9.4, 36, CAST(N'2019-09-03 00:00:00.000' AS DateTime), 3)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 8.8, 36, CAST(N'2019-09-04 00:00:00.000' AS DateTime), 4)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 8.9, 36, CAST(N'2019-09-05 00:00:00.000' AS DateTime), 5)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 8.93, 36, CAST(N'2019-09-06 00:00:00.000' AS DateTime), 6)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 2.56, 36, CAST(N'2019-09-07 00:00:00.000' AS DateTime), 7)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 2, 37, CAST(N'2019-09-08 00:00:00.000' AS DateTime), 1)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 8.66, 37, CAST(N'2019-09-09 00:00:00.000' AS DateTime), 2)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 9.14, 37, CAST(N'2019-09-10 00:00:00.000' AS DateTime), 3)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 9.07, 37, CAST(N'2019-09-11 00:00:00.000' AS DateTime), 4)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 9.29, 37, CAST(N'2019-09-12 00:00:00.000' AS DateTime), 5)
GO
INSERT [dbo].[DLI_TEST_DATE] ([EMPLOYEE_ID], [REG_TOTAL], [WEEK_NUM], [CDATE], [DAYOFWK]) VALUES (N'STU02', 9.94, 37, CAST(N'2019-09-13 00:00:00.000' AS DateTime), 6)
GO

子查询将给定的一周时间拆分为两个不同的支付期(如果适用)。 where条款仅包括加班周,分为两个支付期。 选择包括加班的数学

declare @DLI_TEST_DATA TABLE (
    [EMPLOYEE_ID] [nvarchar](15) NULL,
    [REG_TOTAL] [float] NULL,
    [WEEK_NUM] [int] NULL,
    [CDATE] [datetime] NULL,
    [DAYOFWK] [int] NULL
) 

INSERT into @DLI_TEST_DATA
    VALUES (N'STU02', 2, 34, CAST(N'2019-08-25 00:00:00.000' AS DateTime), 1)
        ,(N'STU02', 8.16, 35, CAST(N'2019-08-26 00:00:00.000' AS DateTime), 2)
        ,(N'STU02', 9.37, 35, CAST(N'2019-08-27 00:00:00.000' AS DateTime), 3)
        ,(N'STU02', 9.07, 35, CAST(N'2019-08-28 00:00:00.000' AS DateTime), 4)
        ,(N'STU02', 7.91, 35, CAST(N'2019-08-29 00:00:00.000' AS DateTime), 5)
        ,(N'STU02', 9.12, 35, CAST(N'2019-08-30 00:00:00.000' AS DateTime), 6)
        ,(N'STU02', 2.65, 35, CAST(N'2019-08-31 00:00:00.000' AS DateTime), 7)
        ,(N'STU02', 2, 35, CAST(N'2019-09-01 00:00:00.000' AS DateTime), 1)
        ,(N'STU02', 4.17, 36, CAST(N'2019-09-02 00:00:00.000' AS DateTime), 2)
        ,(N'STU02', 9.4, 36, CAST(N'2019-09-03 00:00:00.000' AS DateTime), 3)
        ,(N'STU02', 8.8, 36, CAST(N'2019-09-04 00:00:00.000' AS DateTime), 4)
        ,(N'STU02', 8.9, 36, CAST(N'2019-09-05 00:00:00.000' AS DateTime), 5)
        ,(N'STU02', 8.93, 36, CAST(N'2019-09-06 00:00:00.000' AS DateTime), 6)
        ,(N'STU02', 2.56, 36, CAST(N'2019-09-07 00:00:00.000' AS DateTime), 7)
        ,(N'STU02', 2, 36, CAST(N'2019-09-08 00:00:00.000' AS DateTime), 1)
        ,(N'STU02', 8.66, 37, CAST(N'2019-09-09 00:00:00.000' AS DateTime), 2)
        ,(N'STU02', 9.14, 37, CAST(N'2019-09-10 00:00:00.000' AS DateTime), 3)
        ,(N'STU02', 9.07, 37, CAST(N'2019-09-11 00:00:00.000' AS DateTime), 4)
        ,(N'STU02', 9.29, 37, CAST(N'2019-09-12 00:00:00.000' AS DateTime), 5)
        ,(N'STU02', 9.94, 37, CAST(N'2019-09-13 00:00:00.000' AS DateTime), 6)

select WEEK_NUM,fullweek - (case when endfirstperiod+endsecondperiod <= 40 then 40.0 else endfirstperiod+endsecondperiod end) OvertimeCarriedOver
from (
    select week_num,sum(reg_total) fullweek
        ,sum(case when day(cdate) between 10 and 15 then reg_total else 0 end) endfirstperiod
        ,sum(case when day(cdate) between 16 and 21 then reg_total else 0 end) beginsecondperiod
        ,sum(case when day(cdate) between day(eomonth(cdate)) - 5 and day(eomonth(cdate)) then reg_total else 0 end) endsecondperiod
        ,sum(case when day(cdate) between 1 and 6 then reg_total else 0 end) beginfirstperiod
    from @DLI_TEST_DATA
    group by week_num
) basic
where fullweek > 40.0
    and beginfirstperiod+beginsecondperiod > 0
    and endfirstperiod+endsecondperiod > 0
order by week_num
declare@DLI\u TEST\u数据表(
[EMPLOYEE_ID][nvarchar](15)空,
[REG_TOTAL][float]空,
[周数][整数]空,
[CDATE][datetime]空,
[DAYOFWK][int]NULL
) 
插入@DLI_测试_数据
价值(N'STU02',2,34,铸造(N'2019-08-25 00:00:00.000'作为日期时间),1)
,(N'STU02',8.16,35,演员阵容(日期时间:2019-08-26 00:00:00.000),2)
,(N'STU02',9.37,35,演员阵容(日期时间:2019-08-27 00:00:00.000),3)
,(N'STU02',9.07,35,演员阵容(日期时间N'2019-08-28 00:00:00.000),4)
,(N'STU02',7.91,35,演员阵容(日期时间:2019-08-29 00:00:00.000),5)
,(N'STU02',9.12,35,演员阵容(日期时间:2019-08-30 00:00:00.000),6)
,(N'STU02',2.65,35,演员阵容(日期时间:2019-08-31 00:00:00.000),7)
,(N'STU02',2,35,演员阵容(日期时间N'2019-09-01 00:00:00.000),1)
,(N'STU02',4.17,36,演员阵容(日期时间N'2019-09-02 00:00:00.000),2)
,(N'STU02',9.4,36,演员阵容(日期时间:2019-09-03 00:00:00.000),3)
,(N'STU02',8.8,36,演员阵容(日期时间N'2019-09-04 00:00:00.000),4)
,(N'STU02',8.9,36,演员阵容(日期时间N'2019-09-05 00:00:00.000),5)
,(N'STU02',8.93,36,演员阵容(日期时间:2019-09-06 00:00:00.000),6)
,(N'STU02',2.56,36,演员阵容(日期时间:2019-09-07 00:00:00.000),7)
,(N'STU02',2,36,演员阵容(N'2019-09-08 00:00:00.000'作为日期时间),1)
,(N'STU02',8.66,37,演员阵容(日期时间:2019-09-09 00:00:00.000),2)
,(N'STU02',9.14,37,演员阵容(日期时间:2019-09-10 00:00:00.000),3)
,(N'STU02',9.07,37,演员阵容(N'2019-09-11 00:00:00.000'为日期时间),4)
,(N'STU02',9.29,37,演员阵容(N'2019-09-12 00:00:00.000'作为日期时间),5)
,(N'STU02',9.94,37,演员阵容(日期时间:2019-09-13 00:00:00.000),6)
选择WEEK_NUM,fullweek-(endfirstperiod+endsecondperiod 40.0时的情况)
并且beginfirstperiod+beginsecondperiod>0
和endfirstperiod+endsecondperiod>0
按周订购数量

如果适用,子查询将给定的一周工作时间划分为两个不同的支付期。 where条款仅包括加班周,分为两个支付期。 选择包括加班的数学

declare @DLI_TEST_DATA TABLE (
    [EMPLOYEE_ID] [nvarchar](15) NULL,
    [REG_TOTAL] [float] NULL,
    [WEEK_NUM] [int] NULL,
    [CDATE] [datetime] NULL,
    [DAYOFWK] [int] NULL
) 

INSERT into @DLI_TEST_DATA
    VALUES (N'STU02', 2, 34, CAST(N'2019-08-25 00:00:00.000' AS DateTime), 1)
        ,(N'STU02', 8.16, 35, CAST(N'2019-08-26 00:00:00.000' AS DateTime), 2)
        ,(N'STU02', 9.37, 35, CAST(N'2019-08-27 00:00:00.000' AS DateTime), 3)
        ,(N'STU02', 9.07, 35, CAST(N'2019-08-28 00:00:00.000' AS DateTime), 4)
        ,(N'STU02', 7.91, 35, CAST(N'2019-08-29 00:00:00.000' AS DateTime), 5)
        ,(N'STU02', 9.12, 35, CAST(N'2019-08-30 00:00:00.000' AS DateTime), 6)
        ,(N'STU02', 2.65, 35, CAST(N'2019-08-31 00:00:00.000' AS DateTime), 7)
        ,(N'STU02', 2, 35, CAST(N'2019-09-01 00:00:00.000' AS DateTime), 1)
        ,(N'STU02', 4.17, 36, CAST(N'2019-09-02 00:00:00.000' AS DateTime), 2)
        ,(N'STU02', 9.4, 36, CAST(N'2019-09-03 00:00:00.000' AS DateTime), 3)
        ,(N'STU02', 8.8, 36, CAST(N'2019-09-04 00:00:00.000' AS DateTime), 4)
        ,(N'STU02', 8.9, 36, CAST(N'2019-09-05 00:00:00.000' AS DateTime), 5)
        ,(N'STU02', 8.93, 36, CAST(N'2019-09-06 00:00:00.000' AS DateTime), 6)
        ,(N'STU02', 2.56, 36, CAST(N'2019-09-07 00:00:00.000' AS DateTime), 7)
        ,(N'STU02', 2, 36, CAST(N'2019-09-08 00:00:00.000' AS DateTime), 1)
        ,(N'STU02', 8.66, 37, CAST(N'2019-09-09 00:00:00.000' AS DateTime), 2)
        ,(N'STU02', 9.14, 37, CAST(N'2019-09-10 00:00:00.000' AS DateTime), 3)
        ,(N'STU02', 9.07, 37, CAST(N'2019-09-11 00:00:00.000' AS DateTime), 4)
        ,(N'STU02', 9.29, 37, CAST(N'2019-09-12 00:00:00.000' AS DateTime), 5)
        ,(N'STU02', 9.94, 37, CAST(N'2019-09-13 00:00:00.000' AS DateTime), 6)

select WEEK_NUM,fullweek - (case when endfirstperiod+endsecondperiod <= 40 then 40.0 else endfirstperiod+endsecondperiod end) OvertimeCarriedOver
from (
    select week_num,sum(reg_total) fullweek
        ,sum(case when day(cdate) between 10 and 15 then reg_total else 0 end) endfirstperiod
        ,sum(case when day(cdate) between 16 and 21 then reg_total else 0 end) beginsecondperiod
        ,sum(case when day(cdate) between day(eomonth(cdate)) - 5 and day(eomonth(cdate)) then reg_total else 0 end) endsecondperiod
        ,sum(case when day(cdate) between 1 and 6 then reg_total else 0 end) beginfirstperiod
    from @DLI_TEST_DATA
    group by week_num
) basic
where fullweek > 40.0
    and beginfirstperiod+beginsecondperiod > 0
    and endfirstperiod+endsecondperiod > 0
order by week_num
declare@DLI\u TEST\u数据表(
[EMPLOYEE_ID][nvarchar](15)空,
[REG_TOTAL][float]空,
[周数][整数]空,
[CDATE][datetime]空,
[DAYOFWK][int]NULL
) 
插入@DLI_测试_数据
价值(N'STU02',2,34,铸造(N'2019-08-25 00:00:00.000'作为日期时间),1)
,(N'STU02',8.16,35,演员阵容(日期时间:2019-08-26 00:00:00.000),2)
,(N'STU02',9.37,35,演员阵容(日期时间:2019-08-27 00:00:00.000),3)
,(N'STU02',9.07,35,演员阵容(日期时间N'2019-08-28 00:00:00.000),4)
,(N'STU02',7.91,35,演员阵容(日期时间:2019-08-29 00:00:00.000),5)
,(N'STU02',9.12,35,演员阵容(日期时间:2019-08-30 00:00:00.000),6)
,(N'STU02',2.65,35,演员阵容(日期时间:2019-08-31 00:00:00.000),7)
,(N'STU02',2,35,演员阵容(日期时间N'2019-09-01 00:00:00.000),1)
,(N'STU02',4.17,36,演员阵容(日期时间N'2019-09-02 00:00:00.000),2)
,(N'STU02',9.4,36,演员阵容(日期时间:2019-09-03 00:00:00.000),3)
,(N'STU02',8.8,36,演员阵容(日期时间N'2019-09-04 00:00:00.000),4)
,(N'STU02',8.9,36,演员阵容(日期时间N'2019-09-05 00:00:00.000),5)
,(N'STU02',8.93,36,演员阵容(日期时间:2019-09-06 00:00:00.000),6)
,(N'STU02',2.56,36,演员阵容(日期时间:2019-09-07 00:00:00.000),7)
,(N'STU02',2,36,演员阵容(N'2019-09-08 00:00:00.000'作为日期时间),1)
,(N'STU02',8.66,37,