将左侧任意日期的两个表连接到右侧月结束日期

时间:2016-10-29 19:48:59

标签: sql oracle

如何将外部联接保留在列为日常日期的日期(2016年9月13日)到另一个表中作为月结束日期的另一个日期(30-SEP-16)?< / p>

表一 - 交易日期:'9/13/2016' 表二 - 月度日期:'30 -SEP-16'

2 个答案:

答案 0 :(得分:0)

您可以使用trunc()。这是一种方法:

select . . .
from t1 join
     t2 
     on trunc(t1.transactiondate, 'MON') = trunc(t2.monthlydate, 'MON');

这会将两个日期转换为月初。

在某些数据库中,我会提醒您不要在连接条件的两侧使用函数。这些功能可以排除索引的使用。但是,在Oracle中,您可以轻松地在表达式上定义索引,从而提高效率。

您还可以将条件写为:

select . . .
from t1 join
     t2 
     on t1.transactiondate >= trunc(t2.monthlydate, 'MON') AND
        t1.transactiondate < t2.monthlydate + 1;

(如果您知道transactiondate没有时间组件,则可以使用t1.transactiondate <= t2.monthlydate。)

如果日期实际存储为字符串,那么您可以使用to_date()将它们转换为日期并按照上述查询中的逻辑进行操作。

答案 1 :(得分:0)

如果日期始终是该月的最后一天,您可以使用左侧的last_day()功能:

... where last_day(t1.transaction_date) = t2.monthly_date

然而,只有monthy_date是纯粹的&#34;日期(时间设置为00:00:00)。