【问题标题】:Left Join with date and timestamp columns in postgreSQL在 postgreSQL 中使用日期和时间戳列左连接
【发布时间】:2020-05-09 01:17:00
【问题描述】:

我有两张桌子

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) 此列非常重要我需要匹配日期和时间以使 Left 加入 Table1 到 Table2 我可以匹配日期,但随着时间的推移我有问题,两列中的时间总是以秒或毫秒为单位,所以我尝试使用 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 

【问题讨论】:

    标签: sql postgresql left-join


    【解决方案1】:

    您可以使用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 
    

    【讨论】:

      【解决方案2】:

      您可以使用日期/时间不等式。例如:

      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';
      

      这个逻辑适用于他们在任何一方都在 5 秒内。

      【讨论】:

        猜你喜欢
        • 2013-07-17
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 1970-01-01
        相关资源
        最近更新 更多