【问题标题】:Joining SQL date range to existing script将 SQL 日期范围加入现有脚本
【发布时间】:2014-10-15 19:42:01
【问题描述】:

在我的 SQL 脚本中创建日期范围时遇到问题。

我创建了一个日期范围表('dt' 表),它可以作为独立脚本运行,但是当添加到以下脚本时,它只显示 trunc(rl.daudate) = dt.dateval 的日期。即使与 trunc(rl.duedate) 不匹配,我也需要显示 dt.dateval

select dt.dateval, rl.reservation_no, gr.title, gr.catnr, rl.duedate, rl.work_center_no, rl.tec_criteria, rl.qty
from gps_reservation gr, GPS_RESERVATION_LOAD rl,
(select x.dateval from 
    (select (trunc(sysdate+90) - rownum) -1 dateval from dual 
    connect by rownum < (1*90) ) x ) dt
where rl.reservation_no = gr.reservation_no
and rl.plant = 'W'
and gr.active_flag = 'Y'
and gr.cap_flag = 'Y'
and trunc(rl.duedate) = dt.dateval

我通常会使用 (+) 连接,即

and trunc(rl.duedate) (+) = dt.dateval

...但是,我收到“ORA-00936:缺少表达式:-936”错误?

有什么想法吗? 非常感谢

【问题讨论】:

  • 停止使用古老的语法 ANSI 92 已经有 22 年的历史了,所以早于日期的语法必须被认为是古老的。使用 ANSI 语法而不是 (+)
  • 我不知道没有 (+) 语法的另一种加入方式。我是使用旧报告中的现有代码自学的,除了 (+) 之外,我从未使用过任何其他代码。
  • 好的,但是你已经严重过时了;试试这个视觉指南加入codeproject.com/Articles/33052/…
  • 试试这个:trunc(rl.duedate (+))。但正如@Used_By_Already 已经告知的那样,最好使用ANSI 语法。也许这有帮助:oratechinfo.co.uk/ansi_joins.html
  • 关于新语法的 2 个提示。 1,不再在 from 子句中使用逗号; 2,序列确实很重要,您不能加入尚未加入的表。这就是为什么我在下面的 from 子句中更改了表顺序。

标签: sql oracle


【解决方案1】:

试试这个:

SELECT
       dt.dateval
     , rl.reservation_no
     , gr.title
     , gr.catnr
     , rl.duedate
     , rl.work_center_no
     , rl.tec_criteria
     , rl.qty
FROM (
     SELECT (trunc(sysdate + 90) - rownum) - 1 dateval
     FROM dual connect BY rownum < (1 * 90)
     ) dt
LEFT JOIN GPS_RESERVATION_LOAD rl ON dt.dateval = trunc(rl.duedate)
                                     AND rl.plant = 'W'
LEFT JOIN gps_reservation gr      ON rl.reservation_no = gr.reservation_no
                                     AND gr.active_flag = 'Y'
                                     AND gr.cap_flag = 'Y'

【讨论】:

    猜你喜欢
    • 2017-04-27
    • 2011-01-19
    • 1970-01-01
    • 2020-05-23
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多