Select 来自基准的一些日期时间

Select some datetime from base

我的基地里有一个 2 table。第一个 table 是预订 table。 start_ts和end_ts是开始和结束预约的时间(desk_id):

[Reservation_table]

第二个是运动,来自传感器的运动。

[Motion_table]

这 2 个 table 正在连接,当有人来办公桌时,传感器会开始保存到底座 (desk_id)。只要有人坐在办公桌前,传感器的读数就会保存到底座中。大多数情况下,传感器的读数在预订时间之间(预订的开始和结束时间 table)。有时,员工会毫无保留地来到办公室(没有开始和结束时间),但会从运动传感器读取数据。

我想接收包含不在预订时间之间的日期时间的数据。这一刻我有:

query = """
SELECT reservation.user_id, motion.desk_id, reservation.start_ts, reservation.end_ts, 
reservation.confirm_ts, reservation.cancel_ts, 
motion.datetime
FROM reservation
RIGHT JOIN motion ON (reservation.desk_id = motion.desk_id
AND EXTRACT(YEAR FROM reservation.start_ts) = EXTRACT(YEAR FROM motion.datetime)
AND EXTRACT(MONTH FROM reservation.start_ts) = EXTRACT(MONTH FROM motion.datetime)
AND EXTRACT(DAY FROM reservation.start_ts) = EXTRACT(DAY FROM motion.datetime)
AND EXTRACT(HOUR FROM reservation.start_ts) = EXTRACT(HOUR FROM motion.datetime)
AND EXTRACT(MINUTE FROM reservation.start_ts) <= EXTRACT(MINUTE FROM motion.datetime))
ORDER BY motion.datetime;
"""

但是这段代码加入我这 2 table 秒,我不想这样做。我只想有一个不在预订之间的日期时间。看起来像是选定的运动时间。

您需要获取 (select) 传感器数据 (from motion),其中 (where) 没有 (not exists) 保留 (select * from reservation ) 在同一时间点 (and motion.datetime_ between reservation.start_ts and reservation.end_ts) 的同一张桌子 (where motion.desk_id = reservation.desk_id)。这里组成:

select *
from motion
where not exists (
  select 'no reservation for this time point'
  from reservation
  where motion.desk_id = reservation.desk_id
    and motion.datetime_ between reservation.start_ts and reservation.end_ts
)

SQL很自然的表达了你的需求。

另外注意:不要使用关键字作为标识符。所以用其他名称替换日期时间。它是某物的日期时间,那么您可以使用 event_datetime 例如。