如何在SQL中迭代并返回每天的每个可用小时?

如何在SQL中迭代并返回每天的每个可用小时?,sql,sql-server,Sql,Sql Server,我正在尝试从机构管理系统查询有关开放预约时间的数据,并且具有只读访问权限。有一列用于表示可预订时间的冻结时段,另一列用于表示是否已预订时间的已预订时段。24小时内每5分钟间隔表示为0或1。可用时间在blocked slots列中用1表示,在booked slots列中用0表示。迭代并返回可用日期时间的最佳方法是什么 到目前为止,我已经尝试创建case语句,这些语句返回时间作为标题,如果小时可用,则返回值“OPEN”,但我只需要返回每个提供者和位置的每个日期/时间(如果可用) 以下是当前返回日期、

我正在尝试从机构管理系统查询有关开放预约时间的数据,并且具有只读访问权限。有一列用于表示可预订时间的冻结时段,另一列用于表示是否已预订时间的已预订时段。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)