【问题标题】:Join two tables with left-hand side arbitrary date to right-hand side month end date将左侧任意日期的两个表连接到右侧的月结束日期
【发布时间】:2016-10-29 19:48:58
【问题描述】:

我如何才能将外部联接在列为每日日期(如 (9/13/2016))的日期保留到另一个表中列为月末日期的另一个日期,如 (30-SEP-16)?

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

【问题讨论】:

  • 30-SEP-16 不是月末日期。您想在月份和年份相等时加入,还是想在月份的最后一天做一些特定的事情?
  • @Kacper 。 . . 2016-09-30在我熟悉的日历上的月底。
  • @GordonLinoff 你说得对,我看过 SEP 但读过 AUG。但我还是不明白加入条件。
  • 您的示例日期表明日期以文本表示形式和不同格式存储?这是问题所在,还是您难以将每个日期与相应的月末日期结合起来?对 sql vendor 有什么偏好吗?(oracle, tsql, mysql)

标签: sql oracle


【解决方案1】:

您可以使用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 &lt;= t2.monthlydate。)

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

【讨论】:

    【解决方案2】:

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

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

    但是,这仅在 monthy_date 是“纯”日期(时间设置为 00:00:00)时才有效。

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      相关资源
      最近更新 更多