比较两个Oracle数据库中的列,匹配字段是日期,一个时间不是

时间:2016-07-19 20:24:23

标签: sql database oracle

我需要比较并找到来自两个不同Oracle数据库的多个列的百分比错误。 DB1 DATE_TIME列只有日期,没有时间(DD-MON-YY),DB2 DATE_TIME列有日期和时间。每行代表一小时,DB1按小时按正确顺序排列,但没有实际时间。需要相关的列来匹配id和date_time(特别是小时),但是我发现测试DATE相等性的WHERE子句只会给出对应于12:00:00 AM的DB1条目,因为没有时间DB1中日期格式的一部分,所以我无法比较其他时间的正确条目。我怎么能绕过这个?

以下代码更好地说明:

SELECT db1.field1, db2.field1, db1.date_time, db2.date_time
FROM db1, db2
WHERE db1.date_time = db2.date_time AND db1.id = X
ORDER BY db2.date_time DESC;

此查询运行,但没有数据实际匹配,因为它只返回DB1中每天的第一行(对应于12:00:00 AM)。

我已经想过以某种方式在DB1 DATE_TIME列中根据位置插入相应的时间戳,这样我就可以在WHERE中包含时间,但不知道该怎么做,或者它是否会起作用。我已经看到使用BETWEEN day1和day2(而不是=)运行测试查询会在给定的天数内返回我想要的结果,但我不确定如何在JOIN中实现我想要的做DB2。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果您关心性能,我建议您在db2上创建基于函数的索引:

create index idx_db2_datetime_date on db2(trunc(datetime));

然后,您可以在查询中使用此构造:

SELECT db1.field1, db2.field1, db1.date_time, db2.date_time
FROM db1 JOIN
     db2
     ON db1.date_time = trunc(db2.date_time) 
WHERE db1.id = X
ORDER BY db2.date_time DESC;

对于此查询,db1(id, date_time)上的索引也很有帮助。

查询无需索引,但基于函数的索引是使用ON子句中的函数编写性能查询的好方法。

注意:学习使用正确的,明确的JOIN语法。切勿在{{1​​}}子句中使用逗号。

答案 1 :(得分:0)

对于SELECT,您可能需要尝试:

SELECT db1_.field1, db2.field1, db1_.date_time, db2.date_time
FROM (
  SELECT
    id
    , field1
    , date_time + (RANK() OVER (PARTITION BY date_time ORDER BY id - 1) / 24 date_time
  FROM DB1
  ) DB1_
JOIN db2
  ON db1.date_time = TRUNC(db2.date_time, 'HH24')
  AND db1.id = X
ORDER BY db2.date_time DESC;

如果您希望将小时数添加到 DB1.date_time ,请尝试:

UPDATE
  DB1 TDB1
SET TDB1.date_time =
  (SELECT
     d_t 
   FROM
    (SELECT
       id
       , (date_time + (RANK() OVER (PARTITION BY date_time ORDER BY id) - 1) / 24) d_t
    FROM DB1)
  WHERE id = TD1.id
  ) DB1
;

很抱歉,此时没有合适的测试数据可以完整验证。

请评论是否需要调整/进一步详细说明。