Sql 在位置花名册中创建半小时间隔。其中只有打开和关闭时间可用

Sql 在位置花名册中创建半小时间隔。其中只有打开和关闭时间可用,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我有一张桌子,只放一个设施的开放和关闭时间。它在午夜后的几个小时内保存这些数据。我想创建一个视图,从开始到结束,每半个小时按设施显示一次 我尝试使用的代码如下所示: Select LR.CalendarDate, LR.Description, T.Time as Opentime, T1.Time as closetime, T2.Time FROM vw_ITS_LocationRosterWithLocation As LR inner Join dbo.DateDimension

我有一张桌子,只放一个设施的开放和关闭时间。它在午夜后的几个小时内保存这些数据。我想创建一个视图,从开始到结束,每半个小时按设施显示一次

我尝试使用的代码如下所示:

Select LR.CalendarDate, LR.Description, T.Time as Opentime, T1.Time as closetime, T2.Time
FROM    vw_ITS_LocationRosterWithLocation As LR
inner Join dbo.DateDimension As D  On cast (D.Date as date) = CAST (LR.CalendarDate as date)
inner join dbo.TimeDimension as T on T.MinuteFromMidnight = LR.StartTime
Inner Join dbo.TimeDimension as T1 on T1.MinuteFromMidnight = LR.EndTime
Cross join dbo.TimeDimension as T2
这导致:

Date    Facility                Time Open    Time Closed Half Hour Intervals

2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  12:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  12:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  1:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  1:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  2:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  2:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  3:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  3:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  4:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  4:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  5:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  5:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  6:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  6:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  7:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  7:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  8:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  8:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  9:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  9:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  10:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  10:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  11:00:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  11:30:00 AM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  12:00:00 PM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  12:30:00 PM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  1:00:00 PM
2018/06/03  LTCHS - Diamond - S 8:00:00 AM  9:30:00 PM  1:30:00 
我需要看到:

Date            Facility        Time1   Time2
2018/06/03  LTCHS - Diamond - S 08:00am 08:30am
2018/06/03  LTCHS - Diamond - S 08:30am 09:00am
2018/06/03  LTCHS - Diamond - S 09:00am 09:30am
2018/06/03  LTCHS - Diamond - S 09:30am 10:00am
2018/06/03  LTCHS - Diamond - S 10:00am 10:30am
2018/06/03  LTCHS - Diamond - S 10:30am 11:00am
2018/06/03  LTCHS - Diamond - S 11:00am 11:30am
2018/06/03  LTCHS - Diamond - S 12:00pm 12:30pm
2018/06/03  LTCHS - Diamond - S 01:00pm 01:30pm
2018/06/03  LTCHS - Diamond - S 01:30pm 02:00pm
2018/06/03  LTCHS - Diamond - S 02:30pm 03:00pm
2018/06/03  LTCHS - Diamond - S 03:30pm 04:00pm
2018/06/03  LTCHS - Diamond - S 04:00pm 04:30pm
2018/06/03  LTCHS - Diamond - S 05:00pm 05:30pm

我会用一个时间间隔表连接到您的数据

DECLARE @Table TABLE(
    CalendarDate DATETIME,
    Description NVARCHAR(20),
    OpenTime DATETIME,
    CloseTime DATETIME
)


DECLARE @StartOfDay DATETIME = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
DECLARE @EndofDay  DATETIME = DATEADD(SECOND,-1,DATEADD(DAY,1,@StartOfDay))

INSERT @Table SELECT GETDATE(),'T1',DATEADD(HOUR,5,@StartOfDay),DATEADD(HOUR,10,@StartOfDay)
INSERT @Table SELECT GETDATE(),'T2',DATEADD(HOUR,2,@StartOfDay),DATEADD(HOUR,4,@StartOfDay)
INSERT @Table SELECT GETDATE(),'T3',DATEADD(HOUR,5,@StartOfDay),DATEADD(HOUR,10,@StartOfDay)
INSERT @Table SELECT DATEADD(DAY,1,GETDATE()),'T4',DATEADD(HOUR,5,@StartOfDay),DATEADD(HOUR,10,@StartOfDay)

DECLARE @MinuteSlice INT = 30


;WITH Times as 
( 
    SELECT
    TimeOfDay = @StartOfDay
    UNION ALL 
    SELECT TimeOfDay = DATEADD(MINUTE, @MinuteSlice, TimeOfDay) 
    FROM Times WHERE DATEADD(MINUTE, @MinuteSlice, TimeOfDay)  <= @EndofDay 
) 
SELECT 
    Temp.CalendarDate,
    Temp.Description,
    Time1 = Times.TimeOfDay,
    Time2 = DATEADD(MINUTE,@MinuteSlice, Times.TimeOfDay)
FROM 
    Times Times
    LEFT OUTER JOIN @Table Temp ON Times.TimeOfDay BETWEEN Temp.OpenTime AND Temp.CloseTime
WHERE
    NOT Temp.CalendarDate IS NULL
ORDER BY
    Description, 
    CalendarDate,
    Times.TimeOfDay

大家好,欢迎来到SO。我们需要一些细节来帮助你。特别是表定义和示例数据。这是一个好的开始。我会用理货台来解决这个问题。你试过WHERE子句吗?似乎太明显了,没有试过。。。您尝试了什么WHERE子句以及发生了什么?嗨,Sean,您希望表定义来自哪个表,我已经提供了示例数据。第一个表是返回的数据,第二个表是我想看到的。Hi Tab,我尝试了一个WHERE子句来匹配开始时间和半小时。它返回了半小时间隔列中的开始时间。请原谅,我不太理解“我会在与您的数据连接的时间间隔表中执行此操作”是的,时间cte是将一天划分为若干部分的计算,在您的情况下为30分钟间隔。您需要将数据左键连接到它,以填补数据中缺失的空白(stat和end)。我为time1和Time2Tank更新了转置。我有一张时间表。我遇到的主要问题是让它加入/匹配我的数据,使其看起来像上面的示例数据。抱歉,如果我的理解不是很好,这是我不熟悉的SQL领域。我知道你有描述,但我无法从数据表中输入我的描述。更新了一种用你的数据替换测试表的方法,但是,我不能保证这将编译。非常感谢。得到它来获取我的数据并设置半小时的间隔。
SELECT 
    YourData.CalendarDate,
    YourData.Description,
    Time1 = CAST(Times.TimeOfDay AS TIME),
    Time2 = CAST(DATEADD(MINUTE,@MinuteSlice, Times.TimeOfDay) AS TIME)
FROM 
    Times Times
    LEFT OUTER JOIN(
        Select LR.CalendarDate, LR.Description, T.Time as Opentime, T1.Time as closetime, T2.Time
        FROM    vw_ITS_LocationRosterWithLocation As LR
        inner Join dbo.DateDimension As D  On cast (D.Date as date) = CAST (LR.CalendarDate as date)
        inner join dbo.TimeDimension as T on T.MinuteFromMidnight = LR.StartTime
        Inner Join dbo.TimeDimension as T1 on T1.MinuteFromMidnight = LR.EndTime
    )
    YourData ON CAST(Times.TimeOfDay AS TIME) BETWEEN CAST(YourData.OpenTime AS TIME) AND CAST(YourData.CloseTime AS TIME)    
WHERE
    NOT YourData.CalendarDate IS NULL
ORDER BY
    YourData.CalendarDate,
    YourData.Description, 
    Times.TimeOfDay