Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server查找可用的时间段_Sql_Sql Server - Fatal编程技术网

SQL Server查找可用的时间段

SQL Server查找可用的时间段,sql,sql-server,Sql,Sql Server,我是SQL新手,我正在尝试根据所附的示例数据集找出如何获得可用的约会时间。日期部分可以忽略,只有时间重要 提前谢谢你 需要帮助编写SQL查询以提供实际可用插槽: 样本数据: IF OBJECT_ID('tempdb..#MyData') IS NOT NULL DROP TABLE #MyData CREATE TABLE #MyData ( ScheduleTimesId INT, ScheduleId INT, FacilityId INT, ApptTypeId INT, SlotTime

我是SQL新手,我正在尝试根据所附的示例数据集找出如何获得可用的约会时间。日期部分可以忽略,只有时间重要

提前谢谢你

需要帮助编写SQL查询以提供实际可用插槽:

样本数据:

IF OBJECT_ID('tempdb..#MyData') IS NOT NULL DROP TABLE #MyData
CREATE TABLE #MyData (
ScheduleTimesId INT,
ScheduleId INT,
FacilityId INT,
ApptTypeId INT,
SlotTimeStart DATETIME, 
SlotTimeStop DATETIME, 
ApptTimeStart DATETIME, 
ApptTimeStop DATETIME, 
ApptType VARCHAR(30)
)
INSERT INTO #MyData
VALUES
('75999','2124','499','161','1900-01-01 09:00:00.000','1900-01-01 09:20:00.000','1900-01-01 09:00:00.000','1900-01-01 10:00:00.000','Mandatory Dept Meeting')
,('76000','2124','499',NULL,'1900-01-01 09:20:00.000','1900-01-01 09:40:00.000',NULL,NULL,NULL)
,('76001','2124','499',NULL,'1900-01-01 09:40:00.000','1900-01-01 10:00:00.000',NULL,NULL,NULL)
,('76002','2124','499','167','1900-01-01 10:00:00.000','1900-01-01 10:20:00.000','1900-01-01 10:00:00.000','1900-01-01 11:00:00.000','Admin Time')
,('76003','2124','499',NULL,'1900-01-01 10:20:00.000','1900-01-01 10:40:00.000',NULL,NULL,NULL)
,('76004','2124','499',NULL,'1900-01-01 10:40:00.000','1900-01-01 11:00:00.000',NULL,NULL,NULL)
,('76005','2124','499','167','1900-01-01 11:00:00.000','1900-01-01 11:20:00.000','1900-01-01 11:00:00.000','1900-01-01 12:00:00.000','Admin Time')
,('76006','2124','499',NULL,'1900-01-01 11:20:00.000','1900-01-01 11:40:00.000',NULL,NULL,NULL)
,('76007','2124','499',NULL,'1900-01-01 11:40:00.000','1900-01-01 12:00:00.000',NULL,NULL,NULL)
,('76008','2124','499','168','1900-01-01 12:00:00.000','1900-01-01 12:20:00.000','1900-01-01 12:00:00.000','1900-01-01 13:00:00.000','LUNCH - 60 MIN')
,('76009','2124','499',NULL,'1900-01-01 12:20:00.000','1900-01-01 12:40:00.000',NULL,NULL,NULL)
,('76010','2124','499',NULL,'1900-01-01 12:40:00.000','1900-01-01 13:00:00.000',NULL,NULL,NULL)
,('76011','2124','499','160','1900-01-01 13:00:00.000','1900-01-01 13:20:00.000','1900-01-01 13:00:00.000','1900-01-01 15:00:00.000','Team Meeting')
,('76012','2124','499',NULL,'1900-01-01 13:20:00.000','1900-01-01 13:40:00.000',NULL,NULL,NULL)
,('76013','2124','499',NULL,'1900-01-01 13:40:00.000','1900-01-01 14:00:00.000',NULL,NULL,NULL)
,('76014','2124','499',NULL,'1900-01-01 14:00:00.000','1900-01-01 14:20:00.000',NULL,NULL,NULL)
,('76015','2124','499',NULL,'1900-01-01 14:20:00.000','1900-01-01 14:40:00.000',NULL,NULL,NULL)
,('76016','2124','499',NULL,'1900-01-01 14:40:00.000','1900-01-01 15:00:00.000',NULL,NULL,NULL)
,('76017','2124','499',NULL,'1900-01-01 15:00:00.000','1900-01-01 15:20:00.000',NULL,NULL,NULL)
,('76018','2124','499','191','1900-01-01 15:20:00.000','1900-01-01 15:40:00.000','1900-01-01 15:20:00.000','1900-01-01 15:40:00.000','MD Return 20')
,('76019','2124','499','191','1900-01-01 15:40:00.000','1900-01-01 16:00:00.000','1900-01-01 15:40:00.000','1900-01-01 16:00:00.000','MD Return 20')
,('76020','2124','499',NULL,'1900-01-01 16:00:00.000','1900-01-01 16:20:00.000',NULL,NULL,NULL)
,('76021','2124','499',NULL,'1900-01-01 16:20:00.000','1900-01-01 16:40:00.000',NULL,NULL,NULL)
,('76022','2124','499','191','1900-01-01 16:40:00.000','1900-01-01 17:00:00.000','1900-01-01 16:40:00.000','1900-01-01 17:00:00.000','MD Return 20')
SELECT * FROM #MyData

首先,您应该研究将数据标准化的想法,并将不同的实体、时段、约会等存储在不同的表中

因此,您需要做的是找到插槽列表

 SELECT ScheduleTimesId,ScheduleId,FacilityId, ApptTypeId, SlotTimeStart, SlotTimeStop, ApptType 
 FROM #MyData 
以及一份已经预约的名单

SELECT ApptTimeStart, ApptTimeStop 
FROM #MyData 
WHERE ApptTimeStart is not null
从那里,你需要找到哪些插槽中没有任何约会;因此,您从插槽到约会进行左连接,以查看插槽时间与约会时间的交叉点,并且没有约会

;with slots as 
    (SELECT ScheduleTimesId,ScheduleId,FacilityId, ApptTypeId, SlotTimeStart, SlotTimeStop, ApptType FROM #MyData ),
appts as 
     (SELECT ApptTimeStart, ApptTimeStop FROM #MyData where ApptTimeStart is not null)
select * from slots
left join appts 
         on slots.SlotTimeStart>=appts.ApptTimeStart 
         and slots.SlotTimeStop<=appts.ApptTimeStop
where appts.ApptTimeStart is null   

为什么它会返回15:00-15:20、16:00-16:20和16:20-16:40,而不是14:40-15:00?你试过什么?为什么不起作用?如果您查看附件中的第13行,ApptTimeStart和ApptTimeStop的跨度为1900-01-01 13:00:00.000到1900-01-01 15:00:00.000,因此占据了13:00、13:20、13:40、14:00、14:20、14:40的SlotimeStart插槽。ApptTimeStart\ApptTimeStop指示哪些SlotimeStart\SlotimeStop被占用。谢谢!工作起来很有魅力。我用理货和数字表仔细考虑了一下。