【发布时间】:2021-12-17 23:35:27
【问题描述】:
如何使用 CASE 语句将日期时间值分组为时间格式为 HH:MM 的不同班次?问题是不同的班次跨越 24 小时的时间表。请看下面:
CREATE TABLE testData (
[item_id] nvarchar(35) NOT NULL
,[event_time] datetime2(7) NULL
,[location_id] nvarchar(10) NULL
,[start_time_shift_1]nvarchar(5) NULL
,[stop_time_shift_1]nvarchar(5) NULL
,[start_time_shift_2]nvarchar(5) NULL
,[stop_time_shift_2]nvarchar(5) NULL
,[start_time_shift_3]nvarchar(5) NULL
,[stop_time_shift_3]nvarchar(5) NULL
);
INSERT INTO [dbo].[testData](
[item_id]
,[event_time]
,[location_id]
,[start_time_shift_1]
,[stop_time_shift_1]
,[start_time_shift_2]
,[stop_time_shift_2]
,[start_time_shift_3]
,[stop_time_shift_3])
VALUES
('1', '2021-08-18 08:26:00.0000000', '100','09:00','22:29','22:30','04:59','05:00','08:59')
,('2', '2021-08-23 20:20:00.0000000', '100','09:00','22:29','22:30','04:59','05:00','08:59')
,('3', '2021-08-21 03:24:00.0000000', '100','09:00','22:29','22:30','04:59','05:00','08:59')
,('4', '2021-08-20 00:38:00.0000000', '100','09:00','22:29','22:30','04:59','05:00','08:59')
,('5', '2021-08-20 06:10:00.0000000', '100','09:00','22:29','22:30','04:59','05:00','08:59')
,('6', '2021-08-20 05:42:00.0000000', '100','09:00','22:29','22:30','04:59','05:00','08:59')
,('7', '2021-08-23 21:37:00.0000000', '100','09:00','22:29','22:30','04:59','05:00','08:59')
,('8', '2021-08-23 21:37:00.0000000', '200','08:00','21:59','22:00','07:59',NULL,NULL)
,('9', '2021-08-19 04:10:00.0000000', '200','08:00','21:59','22:00','07:59',NULL,NULL)
,('10', '2021-08-20 01:09:00.0000000', '300','12:00','23:39','23:40','11:59',NULL,NULL)
,('11', '2021-08-24 07:14:00.0000000', '300','12:00','23:39','23:40','11:59',NULL,NULL)
,('12', '2021-08-24 16:57:00.0000000', '300','12:00','23:39','23:40','11:59',NULL,NULL)
;
WITH CTE1 AS(
SELECT
[item_id]
,[event_time]
,CONVERT(varchar(5), [event_time], 108) AS [HH:MM]
,[location_id]
,[start_time_shift_1]
,[stop_time_shift_1]
,[start_time_shift_2]
,[stop_time_shift_2]
,[start_time_shift_3]
,[stop_time_shift_3]
FROM [dbo].[testData]
)
SELECT
[item_id]
,[event_time]
,[HH:MM]
,[location_id]
,CASE
WHEN [location_id] = '100' THEN(
CASE WHEN [HH:MM] BETWEEN [start_time_shift_1] AND [stop_time_shift_1] THEN 'Shift_1'
WHEN [HH:MM] BETWEEN [start_time_shift_2] AND [stop_time_shift_2] THEN 'Shift_2'
WHEN [HH:MM] BETWEEN [start_time_shift_3] AND [stop_time_shift_3] THEN 'Shift_3' END)
WHEN [location_id] = '200' THEN(
CASE WHEN [HH:MM] BETWEEN [start_time_shift_1] AND [stop_time_shift_1] THEN 'Shift_1'
WHEN [HH:MM] BETWEEN [start_time_shift_2] AND [stop_time_shift_2] THEN 'Shift_2' END)
END AS [pass]
,[start_time_shift_1]
,[stop_time_shift_1]
,[start_time_shift_2]
,[stop_time_shift_2]
,[start_time_shift_3]
,[stop_time_shift_3]
FROM CTE1
WHERE [location_id] = '100'
【问题讨论】:
-
我想匹配右“班次”内的事件。但问题是,某些班次的班次跨越 00:00(例如,在 22:00 - 07:58 之间)。这可以用其他方式计算吗?提前致谢
-
没错,开始日期应该是 event_time 日期。
-
通过使用 event_time 日期并将其转换为日期时间,然后进行案例比较。但是,如果此人上班迟到,则开始日期可能会推迟到第二天。因此,结果不是确定性的。数据不足
标签: sql-server datetime case