如何在SQL中迭代并返回每天的每个可用小时?
我正在尝试从机构管理系统查询有关开放预约时间的数据,并且具有只读访问权限。有一列用于表示可预订时间的冻结时段,另一列用于表示是否已预订时间的已预订时段。24小时内每5分钟间隔表示为0或1。可用时间在blocked slots列中用1表示,在booked slots列中用0表示。迭代并返回可用日期时间的最佳方法是什么 到目前为止,我已经尝试创建case语句,这些语句返回时间作为标题,如果小时可用,则返回值“OPEN”,但我只需要返回每个提供者和位置的每个日期/时间(如果可用) 以下是当前返回日期、位置、部门、资源、阻止的插槽和预订的插槽的代码:如何在SQL中迭代并返回每天的每个可用小时?,sql,sql-server,Sql,Sql Server,我正在尝试从机构管理系统查询有关开放预约时间的数据,并且具有只读访问权限。有一列用于表示可预订时间的冻结时段,另一列用于表示是否已预订时间的已预订时段。24小时内每5分钟间隔表示为0或1。可用时间在blocked slots列中用1表示,在booked slots列中用0表示。迭代并返回可用日期时间的最佳方法是什么 到目前为止,我已经尝试创建case语句,这些语句返回时间作为标题,如果小时可用,则返回值“OPEN”,但我只需要返回每个提供者和位置的每个日期/时间(如果可用) 以下是当前返回日期、
Select
Cast(vwApptSchedAvail.Available_Date As datetime) As [Date],
vwApptSchedAvail.Location As [Location],
vwApptSchedAvail.Department As [Department],
vwApptSchedAvail.Resource As [Resource],
Available_Days.Blocked_Slots1 + Available_Days.Blocked_Slots2 As [Blocked Slots],
Available_Days.Booked_Slots1 + Available_Days.Booked_Slots2 As [Booked Slots]
From
PM.vwApptSchedAvail vwApptSchedAvail Inner Join
PM.Available_Days Available_Days On vwApptSchedAvail.Available_Date =
Available_Days.Available_Date And vwApptSchedAvail.Resource_ID =
Available_Days.Resource_ID And vwApptSchedAvail.Scheduling_Department_ID =
Available_Days.Scheduling_Department_ID And
vwApptSchedAvail.Scheduling_Location_ID =
Available_Days.Scheduling_Location_ID
Where
vwApptSchedAvail.Available_Date Between '2019-10-23' And '2019-10-23' And
vwApptSchedAvail.Location = 'Location A' And
vwApptSchedAvail.Department = 'OP' And
vwApptSchedAvail.Booking_Factor > 0
Group By
Cast(vwApptSchedAvail.Available_Date As date),
vwApptSchedAvail.Location, vwApptSchedAvail.Department,
vwApptSchedAvail.Resource,
vwApptSchedAvail.Booking_Factor, Available_Days.Blocked_Slots1,
Available_Days.Blocked_Slots2, Available_Days.Booked_Slots1,
Available_Days.Booked_Slots2
我的查询返回如下内容:
+============+============+============+==============+==================================================================================================================================================================================================================================================================================================+==================================================================================================================================================================================================================================================================================================+
| Date | Location | Department | Resource | Blocked Slots | Booked Slots |
+============+============+============+==============+==================================================================================================================================================================================================================================================================================================+==================================================================================================================================================================================================================================================================================================+
| 10/23/2019 | Location A | OP | Provider 1 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
+------------+------------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10/23/2019 | Location A | OP | Provider 2 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000 |
+------------+------------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10/23/2019 | Location A | OP | Provider 3 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
+------------+------------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10/23/2019 | Location A | OP | Provider 4 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110000222222222222111111112222111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
+------------+------------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+==================+============+============+==============+
| Date/Time | Location | Department | Resource |
+==================+============+============+==============+
| 10/23/19 5:00 PM | Location A | OP | Provider 1 |
+------------------+------------+------------+--------------+
| 10/23/19 6:00 PM | Location A | OP | Provider 1 |
+------------------+------------+------------+--------------+
| 10/23/19 7:00 PM | Location A | OP | Provider 1 |
+------------------+------------+------------+--------------+
| 10/23/19 4:00 PM | Location A | OP | Provider 2 |
+------------------+------------+------------+--------------+
| 10/23/19 5:00 PM | Location A | OP | Provider 2 |
+------------------+------------+------------+--------------+
| 10/23/19 7:00 PM | Location A | OP | Provider 2 |
+------------------+------------+------------+--------------+
这是我在使用上述case语句时返回的数据:
+============+============+============+==============+=========+=========+=========+=========+=========+=========+=========+=========+=========+=========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+
| Date | Location | Department | Resource | 0:00:00 | 1:00:00 | 2:00:00 | 3:00:00 | 4:00:00 | 5:00:00 | 6:00:00 | 7:00:00 | 8:00:00 | 9:00:00 | 10:00:00 | 11:00:00 | 12:00:00 | 13:00:00 | 14:00:00 | 15:00:00 | 16:00:00 | 17:00:00 | 18:00:00 | 19:00:00 | 20:00:00 | 21:00:00 | 22:00:00 | 23:00:00 |
+============+============+============+==============+=========+=========+=========+=========+=========+=========+=========+=========+=========+=========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+==========+
| 10/23/2019 | Location A | OP | Provider 2 | | | | | | | | | | | OPEN | | | | | OPEN | | | | | | | | |
+------------+------------+------------+--------------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+
这比0和1好,但仍然不是我需要的格式
我最终希望能够返回这样的内容:
+============+============+============+==============+==================================================================================================================================================================================================================================================================================================+==================================================================================================================================================================================================================================================================================================+
| Date | Location | Department | Resource | Blocked Slots | Booked Slots |
+============+============+============+==============+==================================================================================================================================================================================================================================================================================================+==================================================================================================================================================================================================================================================================================================+
| 10/23/2019 | Location A | OP | Provider 1 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
+------------+------------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10/23/2019 | Location A | OP | Provider 2 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000 |
+------------+------------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10/23/2019 | Location A | OP | Provider 3 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
+------------+------------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10/23/2019 | Location A | OP | Provider 4 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 | 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110000222222222222111111112222111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
+------------+------------+------------+--------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+==================+============+============+==============+
| Date/Time | Location | Department | Resource |
+==================+============+============+==============+
| 10/23/19 5:00 PM | Location A | OP | Provider 1 |
+------------------+------------+------------+--------------+
| 10/23/19 6:00 PM | Location A | OP | Provider 1 |
+------------------+------------+------------+--------------+
| 10/23/19 7:00 PM | Location A | OP | Provider 1 |
+------------------+------------+------------+--------------+
| 10/23/19 4:00 PM | Location A | OP | Provider 2 |
+------------------+------------+------------+--------------+
| 10/23/19 5:00 PM | Location A | OP | Provider 2 |
+------------------+------------+------------+--------------+
| 10/23/19 7:00 PM | Location A | OP | Provider 2 |
+------------------+------------+------------+--------------+
感谢您以文本形式发布您的样本数据,以便我们能够轻松制作此耗材 这个问题有两大障碍。第一个问题是将字符串的噩梦解析为可用的内容。解决这个问题的最简单方法是使用理货台。我在这里创建了一个cte。拥有一个持久的索引表应该会带来一些性能上的好处,但不会有那么多。在这里使用理货台是我处理第一步的方法
declare @Something table
(
ApptDate datetime
, LocationA varchar(20)
, OP char(2)
, Provider varchar(20)
, BlockedSlots varchar(500)
, BookedSlots varchar(500)
)
insert @Something values
('10/23/2019'
, 'Location A'
, 'OP'
, 'Provider 1'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
)
,('10/23/2019'
, 'Location A'
, 'OP'
, 'Provider 2'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000'
)
,('10/23/2019'
, 'Location A'
, 'OP'
, 'Provider 3'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
)
,('10/23/2019'
, 'Location A'
, 'OP'
, 'Provider 4'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110000222222222222111111112222111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
)
;
with E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a cross join E1 b cross join E1 c), --this is enough for 1,000 rows. Way more than we need here
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E2
)
select s.ApptDate
, s.LocationA
, s.OP
, s.Provider
, TimeIsBlocked = substring(s.BlockedSlots, t.N, 1)
, BlockStartTime = dateadd(minute, 5 * (t.N - 1), ApptDate)
, BlockEndTime = dateadd(minute, (5 * (t.N - 1)) + 5, ApptDate)
, TimeIsBooked = substring(s.BookedSlots, t.N, 1)
from @Something s
join cteTally t on t.N <= 288 --the number of 5 minute time slots in a 24 hour period
order by s.Provider
, t.N
declare@Something表
(
应用日期时间
,地址a varchar(20)
,OP char(2)
,提供者varchar(20)
,阻塞插槽varchar(500)
,BookedSlots varchar(500)
)
插入@Something值
('10/23/2019'
“地点A”
“OP”
,“提供者1”
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
)
,('10/23/2019'
“地点A”
“OP”
,“提供商2”
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000'
)
,('10/23/2019'
“地点A”
“OP”
“提供商3”
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
)
,('10/23/2019'
“地点A”
“OP”
“提供者4”
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
, '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111110000222222222222111111112222111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'
)
;
将E1(N)设为(从(值(1)、(1)、(1)、(1)、(1)、(1)、(1)、(1)、(1)、(1)、(1))dt(N)中选择1),
E2(N)AS(从E1 a交叉连接E1 b交叉连接E1 c中选择1),--这足以容纳1000行。比我们需要的多得多
金属(N)AS
(
从E2中选择(ORDER BY(SELECT NULL))上方的行号()
)
选择s.ApptDate
,s.LocationA
,s.OP
,美国供应商
,TimeIsBlocked=子字符串(s.BlockedSlots,t.N,1)
,BlockStartTime=dateadd(分钟,5*(t.N-1),应用日期)
,BlockEndTime=dateadd(分钟,(5*(t.N-1))+5,应用日期)
,TimeIsBooked=子字符串(s.BookedSlots,t.N,1)
从某物
加入cteTally t on t.N OMG你真的这样存储数据吗?这是一场噩梦。它将一组数据压缩到一个元组中,从而违反了1NF。这些网站的更新甚至查询都非常可怕。如果您修复了数据模型,这将变得简单。您应该只存储约会时的数据。请帮助我理解这里的内容。根据您对数据的解释,您已经为提供商1预订了上午8点到下午3:55之间的时间。一天中的前8个小时以及下午4点到5点之间发生了什么。还有,晚上7点后的几个小时呢?关于你在这里想要什么,有相当多的信息你没有分享。我认为你需要提供一份工作。我还建议使用更短的别名(或者至少是d)