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