我在 Microsoft SQL Server 中有一个名为
Downtime
的表,如下所示。我省略了一些不相关的字段和许多条目。
身份证 | 开始时间 | 结束时间 |
---|---|---|
5 | 2024-03-27 09:07:20.653 | 2024-03-27 09:09:07.690 |
17 | 2024-03-27 09:59:50.557 | 2024-03-27 10:59:50.137 |
24 | 2024-03-27 11:04:07.497 | 2024-03-27 11:07:02.657 |
我需要编写一个查询,以以下格式返回上述数据:
t_邮票 | 目前正在下 |
---|---|
2024-03-27 09:07:20.653 | 1 |
2024-03-27 09:09:07.690 | 0 |
2024-03-27 09:59:50.557 | 1 |
2024-03-27 10:59:50.137 | 0 |
2024-03-27 11:04:07.497 | 1 |
2024-03-27 11:07:02.657 | 0 |
换言之,此查询应将每个原始条目拆分为两个条目(一个
t_stamp
表示 StartTime
,一个 t_stamp
表示 EndTime
)并返回值 (CurrentlyDown
) 1(如果 t_stamp
是来自 StartTime
字段)或 0(如果 t_stamp
来自 EndTime
字段)。
我可以考虑尝试两件事:
CASE
语句检查时间戳字段我关心性能,所以我想尽可能高效地做到这一点。我距离 SQL 专家还很远,所以我真的不知道该走哪条路最好(如果有的话)。
这是使用
CROSS APPLY
的一种选择
示例
Select B.*
From YourTable A
Cross Apply ( values (StartTime,1)
,(EndTime ,0)
) B(t_stamp,currentlydown)
结果
t_stamp currentlydown
2024-03-27 09:07:20.653 1
2024-03-27 09:09:07.690 0
2024-03-27 09:59:50.557 1
2024-03-27 10:59:50.137 0
2024-03-27 11:04:07.497 1
2024-03-27 11:07:02.657 0