我有一个关于如何“转动/总计”(想要更好的词)SQL服务器中的一些数据的问题。数据基本上是员工轮班,然后是这些班次的小时数。例如,我在一个表中有一条记录
Staff_ID Shift_start Shift_end
37 09:00 17:30
然后我们会在另一张桌子上给那个人一顿午餐
Staff_ID Start End
37 13:00 14:00
当然,我们全天都有更多的座席,上面的方案已经简化,但你明白了。然后在15分钟内将其转换为员工人数
Interval Staff
09:00 5
09:15 7
09:30 6
等等。
目前,SQL服务器存储了所有这些,但要“完全”代理,我必须将内容带入Access,并使用数组计算出每15分钟一段时间内的人员数量,然后将这些数据保存回数据库。这是一个快速的过程(<1500毫秒),但我正在寻找的是一种在SQL服务器本身中执行此操作的方法,而不必将内容带到Access并将其写回。
我用这个吠叫错了树吗?
编辑:
我正在使用SQL Server 2008R2 Express
答案 0 :(得分:1)
<强>更新强>
试试这个:
;with Intervals(start) as --00:00 - 23:45
(
select dateadd(minute, 0,0)
union all
select dateadd(minute, 15, start) from Intervals
where datediff(hour, 0, dateadd(minute, 15, start))<24
)
select convert(varchar, i.start, 108) [Interval], count(*) [Staff]
from Intervals i
join
(
select cast('09:31:29' as datetime) [start], cast('17:11:29' as datetime) [end] union all
select cast('10:43:12' as datetime), cast('18:21:29' as datetime) union all
select cast('11:59:53' as datetime), cast('19:51:29' as datetime)
)s
on cast(convert(varchar(10), s.start, 108)as datetime) <= i.start
and dateadd(minute, 15, i.start) <= cast(convert(varchar(10), s.[end], 108) as datetime)
group by convert(varchar, i.start, 108)
答案 1 :(得分:0)
您可以尝试一些方法。一种方法是准确地获取Access中的内容并将其转换为SQL。如果你有一部分不确定怎么做,请在这里发布,我们可以提供帮助。
另一种方法是使用光标(而不是单个集合功能)来迭代每个15分钟的时间段,加载在此期间工作的员工,或每个员工的日程安排,填充所有他们的工作15分钟时间段。您可能已经在Access中执行此操作,我无法分辨。
由于它们每天都是相同的15分钟时段,因此您可以将时间存储在表格中并对其进行外部联接,但性能可能比您的访问过程更差。