Инструкция SQL для вычисления разности дат и времени между двумя строками одной таблицы
У меня есть 2 столбца в таблице table1: Time_Stamp
и RunTimeMinute
. Как я могу вычесть значение Time_Stamp
, где RunTimeMinute=0, из значения Time_Stamp
, соответствующего RunTimeMinute=1 (что даст мне время, необходимое для запуска машины)?
Time_Stamp RunTimeMinute
2016-03-01 04:32:10.0000000 1
2016-03-01 04:33:11.0000000 2
2016-03-01 04:34:13.0000000 3
2016-03-01 04:35:15.0000000 4
2016-03-01 04:36:16.0000000 5
2016-03-01 04:37:18.0000000 6
2016-03-01 04:38:20.0000000 7
2016-03-01 04:39:22.0000000 8
2016-03-01 04:40:23.0000000 9
2016-03-01 04:41:16.0000000 0
2016-03-01 04:45:36.0000000 10
3 ответа:
Для выполнения описанной задачи (при условии, что поле
Time_Stamp
является типомDateTime
иRunTimeMinute
является целым числом) можно использовать метод SQLSELECT
запроса / подзапроса и функциюDATEDIFF()
, как показано в следующем примере:SELECT [YourTable].Time_Stamp AS t1, (SELECT YourTable.Time_Stamp FROM YourTable WHERE YourTable.RunTimeMinute=1) AS t0, DateDiff("n",[t0],[t1]) AS ElapsedTimeMin FROM YourTable WHERE ([YourTable].RunTimeMinute)=0;
ElapsedTimeMin
результат отобразится через несколько минут. Вы можете указать "datepart" функцииDATEDIFF()
как "s", чтобы получить результат в секундах.Надеюсь, это может помочь.
Например, у нас есть такой пример:
CREATE TABLE Table1 ( Time_Stamp datetime, RunTimeMinute int ) INSERT INTO Table1 VALUES ('2016-03-01 04:32:10.000', 1), ('2016-03-01 04:33:11.000', 2), ('2016-03-01 04:34:13.000', 3), ('2016-03-01 04:35:15.000', 4), ('2016-03-01 04:36:16.000', 5), ('2016-03-01 04:37:18.000', 6), ('2016-03-01 04:38:20.000', 7), ('2016-03-01 04:39:22.000', 8), ('2016-03-01 04:40:23.000', 9), ('2016-03-01 04:41:16.000', 0), ('2016-03-01 04:45:36.000', 10), ('2016-03-01 05:31:10.000', 1), ('2016-03-01 05:35:11.000', 2), ('2016-03-01 05:37:13.000', 3), ('2016-03-01 05:39:15.000', 4), ('2016-03-01 05:41:16.000', 5), ('2016-03-01 05:46:18.000', 6), ('2016-03-01 05:48:20.000', 7), ('2016-03-01 05:51:22.000', 8), ('2016-03-01 05:53:23.000', 9), ('2016-03-01 05:55:16.000', 0), ('2016-03-01 05:57:36.000', 10), ('2016-03-02 05:34:09.000', 1), ('2016-03-02 05:35:14.000', 2), ('2016-03-02 05:36:11.000', 3), ('2016-03-02 05:37:18.000', 4), ('2016-03-02 05:38:20.000', 5), ('2016-03-02 05:39:38.000', 6), ('2016-03-02 05:40:40.000', 7), ('2016-03-02 05:41:12.000', 8), ('2016-03-02 05:42:32.000', 9), ('2016-03-02 05:44:11.000', 0), ('2016-03-02 05:47:38.000', 10)
Тогда сделаем так:
;WITH cte AS ( SELECT Time_Stamp, RunTimeMinute, ROW_NUMBER() OVER (PARTITION BY RunTimeMinute ORDER BY Time_Stamp) AS rnum FROM Table1 WHERE RunTimeMinute IN (0,1) ) SELECT MIN(Time_Stamp) as StartTime, DATEDIFF(minute, MIN(Time_Stamp), MAX(Time_Stamp)) AS ElapsedTimeMin FROM cte GROUP BY rnum
И вот что:
| StartTime | ElapsedTimeMin | |-------------------------|----------------| | March, 01 2016 04:32:10 | 9 | | March, 01 2016 05:31:10 | 24 | | March, 02 2016 05:34:09 | 10 |