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
例如。
我的基地里有一个 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
例如。