sql - 如何从工作计划中减去非工作计划以在 SQL 中生成新表?
问题描述
我有一个标准化的工作时间表,在某一天看起来像这样:
Working Shift PayDay StartTime EndTime
True Shift1 2020-09-14 2020-09-14 06:00 2020-09-14 14:00
True Shift2 2020-09-14 2020-09-14 14:00 2020-09-14 23:00
True Shift3 2020-09-14 2020-09-14 23:00 2020-09-15 06:00
然后我有另一个表与上述工作时间表有偏差,看起来像这样:
Working Shift PayDay StartTime EndTime
False Shift1 2020-09-14 2020-09-14 10:00 2020-09-14 12:30
从这些表中,我想生成一个表,只显示可用的工作时间。该表应如下所示:
Working Shift PayDay StartTime EndTime
True Shift1 2020-09-14 2020-09-14 06:00 2020-09-14 10:00
True Shift1 2020-09-14 2020-09-14 12:30 2020-09-14 14:00
True Shift2 2020-09-14 2020-09-14 14:00 2020-09-14 23:00
True Shift3 2020-09-14 2020-09-14 23:00 2020-09-15 06:00
在这种情况下,因为我在第 1 班的中间有非工作时间,所以结果表将包含该班次的两个条目。
我是 SQL 新手,不知道如何解决这个问题,有人有什么建议吗?
解决方案
您可以在fiddle中查看答案。为了将来使用,表创建查询可以是:
CREATE TABLE table1 (
[Working] [nvarchar](25),
[Shift] [nvarchar](25),
[PayDay] [nvarchar](25),
[StartTime] datetime,
[EndTime] datetime)
CREATE TABLE table2 (
[Working] [nvarchar](25),
[Shift] [nvarchar](25),
[PayDay] [nvarchar](25),
[StartTime] datetime,
[EndTime] datetime)
INSERT INTO table1 VALUES
('True', 'Shift1', '2020-09-14', '2020-09-14 06:00', '2020-09-14 14:00'),
('True', 'Shift2', '2020-09-14', '2020-09-14 14:00', '2020-09-14 23:00')
INSERT INTO table2 VALUES
('False', 'Shift1', '2020-09-14', '2020-09-14 10:00', '2020-09-14 12:30')
由于您需要一个比前一个具有更多行的新表,因此您可以按照评论中的说明解决问题UNION
。之后,可以应用逻辑参数来创建您的视图。Final_EndTime
是通过获取下一个StartTime
并且仅用于使用的最后一个条目来创建的EndTime
。WhileFinal_StartTime
使用的是EndTime
whenWorking
列False
。
SELECT 'True' AS Final_Working, A.PayDay, A.Shift,
CASE WHEN A.Working = 'False' THEN A.EndTime ELSE A.StartTime END AS Final_StartTime,
CASE WHEN LEAD(A.Working) OVER (ORDER BY A.StartTime) <> '' THEN LEAD(A.StartTime) OVER (ORDER BY A.StartTime) ELSE A.EndTime END AS Final_EndTime
FROM (
SELECT t1.*
FROM table1 AS t1
UNION ALL
SELECT t2.*
FROM table2 AS t2)A
ORDER BY A.StartTime
推荐阅读
- node.js - 从 JSON 文件以编程方式创建对话框
- python - ImportError:无法导入名称 HTMLParser
- ruby-on-rails - 本地 rake 任务需要开发 gems 在生产组中
- haskell - 用于嵌套容器的索引镜头
- r - R:如果 colA 中的 8 个字符的子字符串等于 colB 中的 8 个字符的子字符串,则将 colA 的值添加到新的 colC
- java - 下载网页内容 - 长时间下载
- systemd - 未知 systemd 调用类似 weirf 的命令
- file - Spring Boot-Camel 应用程序中的文件轮询器实现
- python - 将 CUDA 与 pytorch 一起使用?
- spring - 是否可以在@Cacheable spring 中使用我想要的缓存?