【问题标题】:Compare a date with a block of dates in SQL将日期与 SQL 中的日期块进行比较
【发布时间】:2018-10-09 17:32:22
【问题描述】:

我尝试准备很多我在 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

当我的公司收到交通罚单时,我想将罚单中的日期与“Trips”表中日期的孔块进行比较,每个块以 CheckIn = 1 开始并以 CheckOut = 1 结束,所以这样我会通过 DriverID 知道哪个司机负责买票。

例如:交通罚单日期和时间是:17/12/2017 08:00:00,而车辆是 id = 462 的车辆,我将在我们系统的一个字段中插入这个日期和时间,以自动查询哪个司机正在驾驶那个时候有车,我们还不会使用票务表。看我的例子,我知道它应该返回 DriverID = 257,但是有很多相同的车辆和不同的司机的旅行.....主要的问题是我如何将票中的日期和时间与范围进行比较旅行的日期,因为我必须考虑 1 次旅行 = 表中的 2 行

很遗憾,我无法更改创建此表的方式,因为我们需要这 2 行,分别是 CheckIn 和 CheckOut。

有什么想法或方向吗?

感谢您的关注

【问题讨论】:

  • 你想比较什么?即,您是否要列出与机票具有相同日期的所有行程?票证表中有哪些列?您应该很快就会得到答案,但我们首先需要更多信息编辑:您更有可能试图找到票日期在该范围内的 In/Out 行?
  • 每次旅行的 xID 是否唯一?我认为 VehicleID 和 DriverID 可能不是
  • 例如:交通罚单日期和时间是:17/12/2017 08:00:00 并且 Vehicle 是 id = 462 的车辆,我将把这个日期和时间插入到我们系统中的字段自动查询当时哪个司机正在驾驶那辆车,我们还不会使用票务表。看我的例子,我知道它应该返回 DriverID = 257,但是有很多相同的车辆和不同的司机的旅行.....主要的问题是我如何将票中的日期和时间与范围进行比较旅行的日期,因为我必须考虑表中的 1 次旅行 = 2 行。
  • 好消息。在编辑中将其添加到底部的问题中。它最终会在这里消失。
  • 您需要选择较大的日期,然后从这些(子查询)中选择较小的日期。然后你就会知道它是否在范围内。我很快就会发布一些东西。

标签: sql datetime date-comparison


【解决方案1】:
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

【讨论】:

  • 谢谢你,我也会试试你的答案。
【解决方案2】:

我没有制作示例表,这不会按原样运行,但应该为你做这样的事情:

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 风格。

【讨论】:

  • 谢谢,我会尝试在项目中使用。我稍后会发布结果。
猜你喜欢
  • 1970-01-01
  • 2017-12-31
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
相关资源
最近更新 更多