Сравните дату с блоком дат в SQL - PullRequest
0 голосов
/ 09 октября 2018

Я пытался подготовить множество сравнений дат, которые я нашел здесь по stackoverflow и распространил в Интернет, но я не смог найти решение.

У меня есть следующая таблица (Поездки):

VehicleID   DriverID   xID   CheckIn   CheckOut   DateHour
      462        257     7         1          0   16/12/2017 20:40:00
      462        257     7         0          1   19/12/2017 10:05:00
     5032       3746    11         1          0   02/10/2017 07:00:00
     5032       3746    11         0          1   06/10/2017 17:00:00

Когда моя компания получает проездной билет, я хочу сравнить дату из билета с дырочным блоком дат из таблицы «Поездки», каждый блок начинается с CheckIn = 1 и заканчивается CheckOut =1, таким образом, я буду знать, какой драйвер отвечал за билет через DriverID.

Например: дата и время билета на трафик: 17/12/2017 08:00:00, а у транспортного средства - id = 462, я вставлю эту дату и время в поле в нашей системе, чтобы автоматически узнать, какой водительв тот момент ехал на этой машине, мы пока не будем пользоваться билетом.Глядя на мой пример, я знаю, что он должен вернуть DriverID = 257, но есть много поездок с одним и тем же транспортным средством и разными водителями ..... Основная проблема заключается в том, как я могу сравнить дату и час от билета с диапазономдат из поездок, так как я должен рассмотреть 1 поездку = 2 строки в таблице

К сожалению, я не могу изменить способ создания этой таблицы, потому что нам нужны эти 2 строки, CheckIn и CheckOut, отдельно.

Есть мысли или указания?

Спасибо за внимание

Ответы [ 2 ]

0 голосов
/ 09 октября 2018
select t1.VehicleID 
  ,t1.DriverID 
  ,t1.xID
  ,t1.DateHour as Checkin
  ,t2.DateHour as Checkout
from trips as t1 join trips as t2 --self join trips to get both start and end in a single row
  on t1.VehicleID = t2.VehicleID -- add all columns 
 and t1.DriverID = t2.DriverID   -- which define 
 and t1.xID = t2.xID             -- a unique trip
 and t1.Checkin  = 1 -- start
 and t2.Checkout = 1 -- end
join tickets -- now join tickets 
  on tickets.trafficDateHour between t1.DateHour and t2.DateHour
0 голосов
/ 09 октября 2018

Я не создавал примеры таблиц, это не будет работать как есть, но что-то вроде этого должно сделать это для вас:

SELECT *
FROM tickets, trips
WHERE
trips.datehour in (
    SELECT trips.datehour  
    FROM tickets, trips
    WHERE
        tickets.ticket_date < trips.datehour AND
        trips.checkin = 0
) AND
tickets.ticket_date > trips.datehour AND
trips.checkin = 1

Если вы запускаете это на определенную дату, как описано вкомментарий выше, это будет работать.Если вы пытаетесь запустить его одновременно для нескольких дат, вам потребуется рекурсия.Рекурсия - это другой зверь в зависимости от вашего вкуса SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...