Sql server 从1列计算时间

Sql server 从1列计算时间,sql-server,Sql Server,好的,这是我的情况。我们以前的数据库专家SQL Server 2008设置了一个表来存储时间,以提高性能。时间由VB脚本生成并输入到表中 表中的绩效流程:自下而上: 打开1从菜单中选择1->记录时间 打开2窗口显示2->文档的时间 选择1输入帐号并按“搜索”3->记录时间 数据出现时选择2->记录时间4 e、 g 现在,我需要计算两个打开值1和2之间的时间。我确实有很多关于DB的经验,但我一直在思考如何最好地解决这个问题,以确保我是1。得到准确的结果,2。由于在一周内有许多条目,因此计算时间是有

好的,这是我的情况。我们以前的数据库专家SQL Server 2008设置了一个表来存储时间,以提高性能。时间由VB脚本生成并输入到表中

表中的绩效流程:自下而上:

打开1从菜单中选择1->记录时间 打开2窗口显示2->文档的时间 选择1输入帐号并按“搜索”3->记录时间 数据出现时选择2->记录时间4 e、 g

现在,我需要计算两个打开值1和2之间的时间。我确实有很多关于DB的经验,但我一直在思考如何最好地解决这个问题,以确保我是1。得到准确的结果,2。由于在一周内有许多条目,因此计算时间是有效的

谢谢你的建议


Karen

如何获取两个时间值之间的计算时间的基本示例:

;WITH cte AS (
SELECT *
FROM (VALUES
(109, '2016-05-10 20:35:32.243', 'WindowName', 'Select', 2),
(109, '2016-05-10 20:35:29.230', 'WindowName', 'Select', 1),
(109, '2016-05-10 20:35:26.697', 'WindowName', 'Open', 2),   
(109, '2016-05-10 20:35:23.297', 'WindowName', 'Open', 1)
) as t (Msrmnt, [Time], Window, [Function], Position)
)

SELECT  c.Msrmnt,
        c.Window,
        DATEDIFF(MILLISECOND,c.[Time],c1.[Time]) as ms
FROM cte c
INNER JOIN cte c1 
    ON c.Msrmnt = c1.Msrmnt 
        AND c.Window = c1.Window 
        AND c.[Function] = c1.[Function] 
        AND c.Position + 1= c1.Position
WHERE c.[Function] = 'Open' 
输出:

Msrmnt      Window     ms
----------- ---------- -----------
109         WindowName 3400

基于SQL 2008中的日期顺序。如果平台是SQL 2012,则这可以是超前或滞后函数

;WITH X AS (

SELECT 109 AS Msrmnt, CAST('2016-05-10 20:35:32.243' AS DATETIME) As Date, 'WindowName' AS Window,  'Select' AS [Function],   2 AS Position UNION ALL   
SELECT 109,CAST('2016-05-10 20:35:29.230' AS DATETIME),'WindowName' , 'Select',1  UNION ALL
SELECT 109,CAST('2016-05-10 20:35:26.697' AS DATETIME),'WindowName','Open',2     UNION ALL 
SELECT 109,CAST('2016-05-10 20:35:23.297' AS DATETIME),'WindowName','Open',1 
)
SELECT 
 DATEDIFF(S,x1.Date, x2.Date)
 ,x1.Date, x2.Date
FROM x as x1
 INNER JOIN x as x2 
  ON x1.Msrmnt = x2.Msrmnt AND x1.Window = x2.Window AND x1.Date < x2.Date 
WHERE x1.[Function] = 'Open' AND x2.[Function] = 'Open'

好吧,我是这样解决的

Select t.ZP1, t.Form1, t.ZP2, t.Form2, DATEDIFF(MILLISECOND,t.ZP1,t.ZP2) as ms  
From  
(Select p1.time as ZP1, p1.window as Form1, p2.time as ZP2, p2.window as Form2
from tpermonitor p1 LEFT JOIN   
tpermonitor p2 On 
p2.msrmnt = p1.msrmnt 
and p2.Funktion = 'open' 
and p2.Position = 2 and p2.System = 'mysys'  
and p2.time Between '05.04.2016' and '05.13.2016'   
and p2.window = p1.window and p2.msrmnt = p1.msrmnt   
where  p1.System like 'mysys'  
and p1.time Between '05.04.2016' and '05.13.2016'   
and p1.Position = 1  
and p1.Funktion like 'Open'  
and CAST(p2.time as DATE) = CAST(p1.time as DATE)) as t  
Order by t.ZP1
我不确定这是不是最好的解决方案,但它是有效的。我将在将来开发一个更优雅的解决方案,但目前,我将使用这个解决方案

如果有人想发表评论,我愿意


感谢您的所有反馈

将表自联接到自身中,然后您可以使用两个时间列。如果我们只是使用打开的值而忽略选定的值,我们可以有多个示例吗?另外,你能告诉我们预期的结果是什么吗。我们如何关联成对的行?对于给定的Msrmnt值,是否只有两个开放行?您好,gofr谢谢您的回答。我已经尝试实施你的解决方案,但问题是,我不知道测量值是多少109:这是第109次测量,我不知道时间是多少。我可以知道窗口,但不想知道,函数和位置@Damien。。。所有函数都适用,还有其他函数,这些只是示例。我可以将测量值c.msrmnt=c1.msrmnt、windows c.window=c1.window和函数c.function=c1.function等同起来。我仍然可以使用这种方法吗?我假设您只需要测量打开某些窗口之间的距离和时间,而什么窗口及其位置并不重要。我说得对吗?如果是这样的话,答案将非常重要。是的,您可以使用它,但正如我前面所说的,如果您不需要特定的窗口和位置,查询将有所不同。是的,位置很重要,因为位置1和位置2之间的差异是计算出来的。我想再看看你的解决方案,但我最终还是使用了艾伦的想法,谢谢艾伦->见下面的回复。也许你的对我来说会更优雅,但我只是还没看到。我们将看到它是如何发展的。非常感谢你的建议!!您只需更改表名查询中的cte即可尝试我的解决方案:拆下零件;以cte作为。。。。
Select t.ZP1, t.Form1, t.ZP2, t.Form2, DATEDIFF(MILLISECOND,t.ZP1,t.ZP2) as ms  
From  
(Select p1.time as ZP1, p1.window as Form1, p2.time as ZP2, p2.window as Form2
from tpermonitor p1 LEFT JOIN   
tpermonitor p2 On 
p2.msrmnt = p1.msrmnt 
and p2.Funktion = 'open' 
and p2.Position = 2 and p2.System = 'mysys'  
and p2.time Between '05.04.2016' and '05.13.2016'   
and p2.window = p1.window and p2.msrmnt = p1.msrmnt   
where  p1.System like 'mysys'  
and p1.time Between '05.04.2016' and '05.13.2016'   
and p1.Position = 1  
and p1.Funktion like 'Open'  
and CAST(p2.time as DATE) = CAST(p1.time as DATE)) as t  
Order by t.ZP1