Oracle表
以下查询的作用为START_TIME_
,DT.LABEL_DATE_TIME_15MIN_INT
输出与之类似。我必须承认,这是我第一次写这样的联接,是否可以接受,或者是否有更有效/正确的方法来实现这一目标?
select
A.ID,
trunc(A.START_TIME,'dd') + (round(to_char(A.START_TIME,'sssss') / 900) / 96) as START_TIME_,
DT.LABEL_DATE_TIME_15MIN_INT
from TBL_A A
inner join DATE_TIME DT
on ((trunc(A.IN_TIME_START,'dd') + (round(to_char(A.IN_TIME_START,'sssss') / 900) / 96)) = DT.DATE_TIME_15MIN_INT)
order by A.ID;
接近原因:A.START_TIME
是TIMESTAMP(6)
GMT-5 DT
表格在GMT中具有EPOCH时间键,具有相应的"格式化标签"调整为GMT-5。而不是将A.START_TIME
转换为EPOCH,调整时区,并加入密钥,我将算术执行到A
到正确的15分钟间隔,然后加入标签。我在这里错过了一个非常简单的解决方案
答案 0 :(得分:1)
我会采用更简洁的方法:
SELECT
a.id,
a.start_time_,
dt.label_date_time_15min_int
FROM
date_time dt
JOIN (
SELECT
id,
TRUNC(in_time_start,'dd') + (ROUND(TO_CHAR(in_time_start,'sssss') / 900) / 96) AS in_time_start_,
TRUNC(start_time,'dd') + (ROUND(TO_CHAR(start_time,'sssss') / 900) / 96) AS start_time_
FROM
tbl_a
) a ON a.in_time_start_ = dt.date_time_15min_int
ORDER BY
a.id
;
但从根本上说,没有多大区别。您的加入是有效的,如果您愿意,也可以将其放在where子句中。在这一点上,如果没有结构性和应用性的改变,你可以做很多事情来优化它。