2012-05-16 2 views
0

Прежде всего, я не являюсь носителем английского языка, и это трудно объяснить. Если у вас есть какие-либо сомнения, сообщите мне.Как сделать запрос цикла sql, чтобы проверить разницу между значениями?

Мы используем устройство слежения за автотранспортными средствами GPS, которое запрограммировано на отправку и хранение в БД места в автомобиле каждые 5 минут, когда оно не перемещается, и каждые 100 метров при движении.

В этой БД имеется таблица под названием «vehicle_gps», в которой хранятся данные со значениями, такими как скорость, положение, дата и время, vehicle_gps_id.

Мне нужен какой-то запрос, который покажет разные позиции, где транспортное средство остановилось более определенного времени (например, 2 минуты, отбрасывая светофоры).

Например, мне нужно что-то, что может сказать мне следующее: «Автомобиль был на Positon1 (P1) в 8:00, он оставил P1 в направлении P2, достигнув отметки 8.20. Автомобиль остался на P2 до 10.20 и он достиг P3 в 10.50"

пример записей в таблице

vehicle_gps_id | datetime---------- | latitude | longitude | speed 

1000------------| 05/16/2012 08:00:00|50.0000 |50.00000 |40 (km/h) 
1001------------| 05/16/2012 08:01:00|51.0000 |51.00000 |38 (km/h) 
1002------------| 05/16/2012 08:01:23|51.0045 |50.000054 |40 (km/h) 
1003------------| 05/16/2012 08:01:40|51.00540 |51.0005430 |39 (km/h) 
. 
. 
. 
1040------------| 05/16/2012 08:20:40|53.00540 |53.0005430 |0 (km/h) 
1041------------| 05/16/2012 08:25:40|53.00540 |53.0005430 |0 (km/h) 
1042------------| 05/16/2012 08:30:40|53.00540 |53.0005430 |0 (km/h) 
. 
. 
. 
1060------------| 05/16/2012 10:20:40|53.00540|53.0005430|20 (km/h) 

Как я могу сделать что-то подобное?

До сих пор я мог получить разницу в минутах между фиксированными позициями, и по этой причине мне нужен цикл, который бы проверял все даты между позициями и прерывался всякий раз, когда разница была больше 5 минут, а это означает, что автомобиль остановился.

ТИА

ответ

0
DECLARE @idFrom as int, 
     @idTo as int, 
     @gpsDateFrom as datetime, 
     @gpsDateTo as datetime 
DECLARE VehicleCursor CURSOR FAST_FORWARD FOR 
SELECT vehicle_gps_id, 
     datetimeCol 
FROM yourtable 
ORDER BY vehicle_gps_id 
OPEN VehicleCursor FETCH NEXT FROM VehicleCursor INTO @idFrom, @gpsDateFrom 
    FETCH NEXT FROM VehicleCursor INTO @idTo, @gpsDateTo 
    WHILE @@FETCH_STATUS = 0 BEGIN 
     IF DATEDIFF(MI,@gpsDateFrom,@gpsDateTo) >5 
     BEGIN 
      --Break (your code here) 
     END 
     SET @idFrom = @idTo 
     SET @gpsDateFrom = @gpsDateTo 
     FETCH NEXT FROM VehicleCursor INTO @idTo, @gpsDateTo 
    END 
CLOSE VehicleCursor 
DEALLOCATE VehicleCursor 

Что-то, как это должно работать для вас. Это курсор, который просто проходит через все ваши столбцы, сравнивая даты. Вы можете ввести все, что хотите сделать, в раздел с комментариями после оператора if.

+0

Спасибо за ваш ответ. Я получаю 2 ошибки: 1) «Неверный синтаксис рядом с ключевым словом SET», прямо под комментарием. 2) «Неверный синтаксис возле VehicleCursor», в конце. –

+0

А я забыл изменить имя переменной, не знаю, исправит ли она обе проблемы, я отредактировал ее, чтобы повторить попытку. – jeschafe

+0

Я не изменял комментарий, поэтому сообщение об ошибке = P. С другой стороны, я до сих пор не знаю, как отображать нужную информацию на каждом перерыве. Чтобы проверить, что он работает, я сделал запрос select, поэтому он дает мне 8 результатов запроса, что является правильным, потому что это количество остановок автомобиля. В любом случае, еще раз спасибо за вашу помощь –

Смежные вопросы