Левое соединение со столбцами даты и времени в postgreSQL - PullRequest
0 голосов
/ 09 мая 2020

У меня есть две таблицы

table1 (id, dept_id, position_id, pin, name, last_name, create_time)

table2 (dept_id, pin, name, last_name, zone_id, create_time)

, и у них есть оба столбца create_time , в котором дата и время хранятся в этом формате (2019-12-01 18: 00: 00.568) этот столбец очень важен. Мне нужно сопоставить даты и время, чтобы левое соединение таблицы1 и таблицы2. Я могу сопоставить дату, но со временем у меня возникла проблема, время в обоих столбцах всегда имеет разницу в в секунду или в миллисекундах, поэтому я пытаюсь преобразовать в текст с помощью to_char (). Мне нужно объединить две таблицы ежедневно и ежечасно (24 часа), чтобы составить отчет


Вот мой запрос
SELECT p.dept_id, p.pin, p.name, p.last_name, p.position_id, a.zone_id, p.create_time::date, to_char(p.create_time::timestamp::time, 'HH24:MI') as time
FROM table1 p
LEFT JOIN table2 a
ON p.create_id::date=a.create_time::date AND
p.pin=a.pin AND p.dept_id=a.dept_id 

Это дает мне совпадения по дате, но не по времени. Мне нужно что-то вроде этого

SELECT p.dept_id, p.pin, p.name, p.last_name, p.position_id, a.zone_id, p.create_time::date, to_char(p.create_time::timestamp::time, 'HH24:MI') as time1, to_char(a.create_time::timestamp::time, 'HH24:MI') as time2
    FROM table1 p
    LEFT JOIN table2 a
    ON p.create_id::date=a.create_time::date AND
    time1 = time2 AND 
    p.pin=a.pin AND 
    p.dept_id=a.dept_id 

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Вы можете использовать date_trunc для усечения метки времени до часа и join на этом:

SELECT p.dept_id, p.pin, p.name, p.last_name, p.position_id, a.zone_id,
       p.create_time::date, to_char(p.create_time::timestamp::time, 'HH24:MI') as time
FROM table1 p
LEFT JOIN table2 a ON date_trunc('hour', p.create_time) = date_trunc('hour', a.create_time)
                  AND p.pin=a.pin
                  AND p.dept_id=a.dept_id 
0 голосов
/ 09 мая 2020

Вы можете использовать неравенство даты / времени. Например:

SELECT p.dept_id, p.pin, p.name, p.last_name, p.position_id, a.zone_id, 
       p.create_time::date, to_char(p.create_time::timestamp::time, 'HH24:MI') as time
FROM table1 p LEFT JOIN
     table2 a
     ON p.pin = a.pin AND
        p.dept_id = a.dept_id AND
        p.create_id >= a.create_time - INTERVAL '5 second' AND
        p.create_id <= a.create_time + INTERVAL '5 second';

Этот лог c для них находится в пределах 5 секунд с каждой стороны.

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