我正在计算 Night_Start_Time、Night_Shift_End、Night_Shift_Duration
我们已经定义了 Night_Shift_Start_Time = 22:00 hrs 和 Night_Shift_End_Time = 06:00 hrs。
要获得夜班资格,员工应至少工作 30 分钟,否则将不被视为夜班
例如;
表
CREATE TABLE #Shift
(Eid int,
Shift_Start datetime,
Shift_End datetime);
GO
INSERT INTO #Shift
VALUES
(1,'20170522 20:00:00.000','20170523 06:00:00.000'),
(2,'20170522 02:00:00.000','20170522 12:00:00.000'),
(3,'20170522 23:00:00.000','20170523 08:00:00.000'),
(4,'20170522 23:00:00.000','20170523 00:00:00.000'),
(5,'20170522 00:00:00.000','20170522 05:00:00.000'),
(6,'20170522 15:00:00.000','20170522 21:00:00.000');
GO
预期输出
Eid Shift_Start Shift_End Night_Start_Time Night_Shift_End Night_Shift_Duration
1 2017-05-22 20:00:00.000 2017-05-23 06:00:00.000 2017-05-22 22:00:00.000 2017-05-23 06:00:00.000 8
2 2017-05-22 02:00:00.000 2017-05-22 12:00:00.000 2017-05-22 02:00:00.000 2017-05-22 06:00:00.000 4
3 2017-05-22 23:00:00.000 2017-05-23 08:00:00.000 2017-05-22 23:00:00.000 2017-05-23 06:00:00.000 7
4 2017-05-22 23:00:00.000 2017-05-23 00:00:00.000 2017-05-22 23:00:00.000 2017-05-23 00:00:00.000 1
5 2017-05-22 00:00:00.000 2017-05-22 05:00:00.000 2017-05-22 00:00:00.000 2017-05-22 05:00:00.000 5
6 2017-05-22 15:00:00.000 2017-05-22 21:00:00.000 NULL NULL 0
请尝试以下代码...
SELECT Eid,
Shift_Start,
Shift_End,
CASE
WHEN DATEDIFF( S,
CASE
WHEN CAST( Shift_Start AS TIME ) BETWEEN '05:30:01' AND '22:00:00' THEN
CAST( ( CAST( CAST( Shift_Start AS DATE ) AS VARCHAR ) + ' 22:00' ) AS DATETIME )
ELSE
Shift_Start
END,
CASE
WHEN CAST( Shift_End AS TIME ) BETWEEN '06:00:01' AND '22:29:59' THEN
CAST( ( CAST( CAST( Shift_End AS DATE ) AS VARCHAR ) + ' 06:00' ) AS DATETIME )
ELSE
Shift_End
END
) >= 1800 THEN
CASE
WHEN CAST( Shift_Start AS TIME ) BETWEEN '05:30:01' AND '22:00:00' THEN
CAST( ( CAST( CAST( Shift_Start AS DATE ) AS VARCHAR ) + ' 22:00' ) AS DATETIME )
ELSE
Shift_Start
END
ELSE
NULL
END AS Night_Start_Time,
CASE
WHEN DATEDIFF( S,
CASE
WHEN CAST( Shift_Start AS TIME ) BETWEEN '05:30:01' AND '22:00:00' THEN
CAST( ( CAST( CAST( Shift_Start AS DATE ) AS VARCHAR ) + ' 22:00' ) AS DATETIME )
ELSE
Shift_Start
END,
CASE
WHEN CAST( Shift_End AS TIME ) BETWEEN '06:00:01' AND '22:29:59' THEN
CAST( ( CAST( CAST( Shift_End AS DATE ) AS VARCHAR ) + ' 06:00' ) AS DATETIME )
ELSE
Shift_End
END
) >= 1800 THEN
CASE
WHEN CAST( Shift_End AS TIME ) BETWEEN '06:00:01' AND '22:29:59' THEN
CAST( ( CAST( CAST( Shift_End AS DATE ) AS VARCHAR ) + ' 06:00' ) AS DATETIME )
ELSE
Shift_End
END
ELSE
NULL
END AS Night_Shift_End,
CASE
WHEN DATEDIFF( S,
CASE
WHEN CAST( Shift_Start AS TIME ) BETWEEN '05:30:01' AND '22:00:00' THEN
CAST( ( CAST( CAST( Shift_Start AS DATE ) AS VARCHAR ) + ' 22:00' ) AS DATETIME )
ELSE
Shift_Start
END,
CASE
WHEN CAST( Shift_End AS TIME ) BETWEEN '06:00:01' AND '22:29:59' THEN
CAST( ( CAST( CAST( Shift_End AS DATE ) AS VARCHAR ) + ' 06:00' ) AS DATETIME )
ELSE
Shift_End
END
) >= 1800 THEN
DATEDIFF( S,
CASE
WHEN CAST( Shift_Start AS TIME ) BETWEEN '05:30:01' AND '22:00:00' THEN
CAST( ( CAST( CAST( Shift_Start AS DATE ) AS VARCHAR ) + ' 22:00' ) AS DATETIME )
ELSE
Shift_Start
END,
CASE
WHEN CAST( Shift_End AS TIME ) BETWEEN '06:00:01' AND '22:29:59' THEN
CAST( ( CAST( CAST( Shift_End AS DATE ) AS VARCHAR ) + ' 06:00' ) AS DATETIME )
ELSE
Shift_End
END
) / 3600.0
ELSE
0.0
END AS Night_Shift_Duration
FROM #Shift;
该语句首先使用以下部分来选择夜班开始时间(相对于班次开始时间)...
CASE
WHEN CAST( Shift_Start AS TIME ) BETWEEN '05:30:01' AND '22:00:00' THEN
CAST( ( CAST( CAST( Shift_Start AS DATE ) AS VARCHAR ) + ' 22:00' ) AS DATETIME )
ELSE
Shift_Start
END
此部分提取 的TIME
组件Shift_Start
并进行测试以查看它是否在夜班时间范围之外。如果是,则它提取 的DATE
组件Shift_Start
并将其转换为字符串,以便它可以将日期与夜班开始时间的字符串表示连接起来。然后将连接的字符串转换为其等效DATETIME
值。
如果 的TIME
组件Shift_Start
不在夜班时间范围之外,则Shift_Start
返回的值。
以下语句使用类似的逻辑来确定夜班结束时间...
CASE
WHEN CAST( Shift_End AS TIME ) BETWEEN '05:30:01' AND '22:00:00' THEN
CAST( ( CAST( CAST( Shift_End AS DATE ) AS VARCHAR ) + ' 06:00' ) AS DATETIME )
ELSE
Shift_End
END
如果所识别的夜班结束时间的记录超过1800
秒(30
表示为秒分钟,从而允许通过所述第二电平的精度)之后所识别的夜班开始时间该记录,则该字段Night_Start_Time
和Night_Shift_End
该记录将是设置为他们各自的夜班时间,Night_Shift_Duration
并设置为他们之间的小时差,计算方法为秒差除以一小时的秒数。
我已经针对使用您提供的脚本创建的数据库测试了我的语句(谢谢您),并取得了预期的结果。
如果您有任何问题或意见,请随时发表相应的评论。
附录1
以下语句是针对示例数据库运行的,以允许进一步测试...
INSERT INTO #Shift
VALUES ( 7,
'20170522 05:31:00',
'20170522 22:01:00' ),
( 8,
'20170522 04:31:00',
'20170522 22:01:00' );
附录二
以下语句是上述语句的变体,它使用子查询来确定每条记录的Night_Start_Time
和的值,而不考虑两者之间的差异。主查询使用如此生成的值来确定、和的最终值。Night_Shift_End
Night_Start_Time
Night_Shift_End
Night_Shift_Duration
我不确定哪个更有效。
SELECT Eid,
Shift_Start,
Shift_End,
CASE
WHEN DATEDIFF( S,
Night_Start_Time,
Night_Shift_End
) >= 1800 THEN
Night_Start_Time
ELSE
NULL
END AS Night_Start_Time,
CASE
WHEN DATEDIFF( S,
Night_Start_Time,
Night_Shift_End
) >= 1800 THEN
Night_Shift_End
ELSE
NULL
END AS Night_Shift_End,
CASE
WHEN DATEDIFF( S,
Night_Start_Time,
Night_Shift_End
) >= 1800 THEN
DATEDIFF( S,
Night_Start_Time,
Night_Shift_End
) / 3600.0
ELSE
0.0
END AS Night_Shift_Duration
FROM ( SELECT Eid,
Shift_Start,
Shift_End,
CASE
WHEN CAST( Shift_Start AS TIME ) BETWEEN '05:30:01' AND '22:00:00' THEN
CAST( ( CAST( CAST( Shift_Start AS DATE ) AS VARCHAR ) + ' 22:00' ) AS DATETIME )
ELSE
Shift_Start
END Night_Start_Time,
CASE
WHEN CAST( Shift_End AS TIME ) BETWEEN '06:00:01' AND '22:29:59' THEN
CAST( ( CAST( CAST( Shift_End AS DATE ) AS VARCHAR ) + ' 06:00' ) AS DATETIME )
ELSE
Shift_End
END Night_Shift_End
FROM #Shift
) AS shiftTimesFinder;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句