SQL - 派生日期差异列

时间:2010-07-08 16:22:38

标签: sql sql-server date calculated-columns

 
+------+-------------------------+
| proc |                 endTime |
+------+-------------------------+
|    A | 2010/01/01 12:10:00.000 |
|    B | 2010/01/01 12:08:00.000 |
|    C | 2010/01/01 12:05:00.000 |
|    D | 2010/01/01 12:02:00.000 |
|   ...|                     ... |

基本上,我从数据库中提取的数据看起来与上面类似,第一列是进程的名称,第二列是完成运行的时间。我想添加一个THIRD列,它显示进程的运行时间。

基本上,我希望拉出的数据看起来像这样:

 
+------+-------------------------+--------------+
| proc |                 endTime |  runningTime |
+------+-------------------------+--------------+
|    A | 2010/01/01 12:10:00.000 |              | (process a is not done running)
|    B | 2010/01/01 12:08:00.000 | 00:03:00.000 |
|    C | 2010/01/01 12:05:00.000 | 00:03:00.000 |
|    D | 2010/01/01 12:02:00.000 | 00:02:00.000 | (assume 12:00 start time)
|   ...|                     ... |          ... |

而且我知道添加startTime列会更容易确定runningTime,但是我没有权限更改它,并且无论旧数据是否都没有startTime无论如何都要工作。

第一个进程的开始时间是任意的,但是你看到我正在得到的东西。我们知道proc C的运行时间基于proc D何时结束,以及proc C何时结束(从第二个减去第一个)。

如何根据“Row X Col B”和“Row X-1 Col B”之间的差异计算第三行?

1 个答案:

答案 0 :(得分:1)

我认为您不能将其添加为“计算列”。你可以很容易地在视图中计算它(MSSQL的所有代码。你的转换函数可能会有所不同):

select 
    e1.RowID, 
    e2.EndTime as StartTime, 
    e1.EndTime, runningtime=convert(varchar(20), e1.EndTime - e2.EndTime, 114)
from endtimetest e1
    left join endtimetest e2 on e2.endtime = 
            (Select max(endtime) 
              from endtimetest 
              where endtime < e1.Endtime) 

或者,您可以使用类似的东西在触发器中计算它。