SQL - столбец разницы в дате получения - PullRequest
0 голосов
/ 08 июля 2010
 
+------+-------------------------+
| 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 |
|   ...|                     ... |

Таким образом, в основном данные, которые я извлекаю из базы данных, будут выглядеть примерно так, как показано выше: первый столбец - это имя процесса, а второй - время его завершения.Я хочу добавить ТРЕТИЙ столбец, где он отображает время выполнения процесса.

По сути, я хочу, чтобы вытащенные данные выглядели так:

+------+-------------------------+--------------+
| 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 Ответ

1 голос
/ 08 июля 2010

Я не думаю, что вы можете добавить его как «вычисляемый столбец». Вы можете вычислить его в представлении довольно легко, как это (весь код для 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) 

Или вы можете вычислить его в триггере с чем-то похожим.

...