【问题标题】:ORA-00904: "DATEADD": invalid identifier [duplicate]ORA-00904: "DATEADD": 无效标识符 [重复]
【发布时间】:2021-12-01 09:15:57
【问题描述】:

我正在尝试使用以下查询检索数据集:

SELECT
    p.homelaborlevelnm1,
    p.workemailaddress,
    r.requestitemid,
    p.personfullname              "EMPLOYEE Name",
    p.personnum                   "EMPLOYEE ID",
    p2.personfullname             "SUPERVISOR",
    p4.personfullname             "PREVIOUS APPROVER",
    p3.personfullname             "NEXT APPROVER",
    ri.approvalstepnum            "APPROVAL_STEP",
    r.creationdtm                 "SUBMIT_DATE",
    r.startdtm                    "START_DATE",
    r.enddtm                      "END_DATE",
    rs.requeststatusnm            "STATUS",
    pc.name                       "PAY_CODE",
    st.symbolicamounttypenm       "SYMBOLIC_AMOUNT",
    ( gt.durationminqty / 60.00 ) "DURATION",
    rst.requestsubtypnm           "REQUEST_TYPE",
    c.commenttext                 "COMMENT",
    cdt.comntnotetxt              "REASON FOR ABSENCE"
FROM
    requestitem        r
    LEFT OUTER JOIN reqitemcomntmm     rc ON rc.requestitemid = r.requestitemid
    LEFT OUTER JOIN vp_allpersonv42    p ON p.personid = r.employeeid
    LEFT OUTER JOIN comments           c ON c.commentid = rc.commentid
    LEFT OUTER JOIN comntnotedtl       cdt ON cdt.comntnoteid = rc.comntnoteid
    LEFT OUTER JOIN wtkemployee        wtke ON wtke.employeeid = p.personid
    LEFT OUTER JOIN vp_allpersonv42    p2 ON p2.personid = wtke.supervisorid
    LEFT OUTER JOIN requeststatus      rs ON rs.requeststatusid = r.requeststatusid
    LEFT OUTER JOIN requestsubtype     rst ON rst.requestsubtypid = r.requestsubtypid
    LEFT OUTER JOIN glbtimeoffreqitem  gt ON r.requestitemid = gt.requestitemid
    LEFT OUTER JOIN symbolicamounttype st ON st.symbolicamounttypeid = gt.symbolicamounttypeid
    LEFT OUTER JOIN paycode            pc ON pc.paycodeid = gt.paycodeid
    LEFT OUTER JOIN reqitemapproval    ri ON ri.requestitemid = r.requestitemid
    LEFT OUTER JOIN vp_allpersonv42    p3 ON p3.personid = ri.approverid
    LEFT OUTER JOIN reqstatchange      rsc ON rsc.requestitemid = r.requestitemid
    LEFT OUTER JOIN vp_allpersonv42    p4 ON p4.personid = rsc.useraccountid
WHERE
        r.requeststatusid = '4'
    AND ( r.startdtm BETWEEN dateadd(d, - 7, current_timestamp) AND current_timestamp
          OR r.enddtm BETWEEN dateadd(d, - 7, current_timestamp) AND current_timestamp )
ORDER BY
    p.personnum,
    rs.requeststatusnm,
    r.startdtm;

很遗憾,我收到以下错误:

ORA-00904: "DATEADD": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Error at Line: 85 Column: 21

我以以下方式使用SYSDATE() 编辑了查询

SELECT

P.HOMELABORLEVELNM1,

P.WORKEMAILADDRESS,

/* CHANGE ABOVE LINE TO LABOR LEVEL THAT YOU TRACK DEPT IF IT ISN'T LL1 */

  R.REQUESTITEMID,

  P.PERSONFULLNAME "EMPLOYEE Name",

P.PERSONNUM "EMPLOYEE ID",

  P2.PERSONFULLNAME "SUPERVISOR",

  /* THE APPROVER AND APPROVAL_STEP FIELDS WILL BE NULL UNLESS APPROVAL SETTINGS ARE USED */

  P4.PERSONFULLNAME "PREVIOUS APPROVER",

  P3.PERSONFULLNAME "NEXT APPROVER",

  RI.APPROVALSTEPNUM "APPROVAL_STEP",

  R.CREATIONDTM "SUBMIT_DATE",

  R.STARTDTM "START_DATE",

  R.ENDDTM "END_DATE",

  RS.REQUESTSTATUSNM "STATUS",

  PC.NAME "PAY_CODE",

  ST.SYMBOLICAMOUNTTYPENM "SYMBOLIC_AMOUNT",

  /* DURATION WILL BE NULL IF THE EMPLOYEE REQUESTS FULL OR HALF DAYS */

  (GT.DURATIONMINQTY/60.00) "DURATION",

  RST.REQUESTSUBTYPNM "REQUEST_TYPE",

C.COMMENTTEXT "COMMENT",

  CDT.COMNTNOTETXT "REASON FOR ABSENCE"

FROM

  REQUESTITEM R

  LEFT OUTER JOIN REQITEMCOMNTMM rc ON rc.REQUESTITEMID = r.REQUESTITEMID

  LEFT OUTER JOIN VP_ALLPERSONV42 p ON p.PERSONID = r.EMPLOYEEID

  LEFT OUTER JOIN COMMENTS c ON c.COMMENTID = rc.COMMENTID

  LEFT OUTER JOIN COMNTNOTEDTL cdt ON cdt.COMNTNOTEID = rc.COMNTNOTEID

  LEFT OUTER JOIN WTKEMPLOYEE wtke ON wtke.EMPLOYEEID = p.PERSONID

  LEFT OUTER JOIN VP_ALLPERSONV42 p2 ON p2.PERSONID = wtke.SUPERVISORID

  LEFT OUTER JOIN REQUESTSTATUS rs ON rs.REQUESTSTATUSID = r.REQUESTSTATUSID

  LEFT OUTER JOIN REQUESTSUBTYPE rst ON rst.REQUESTSUBTYPID = r.REQUESTSUBTYPID

  LEFT OUTER JOIN GLBTIMEOFFREQITEM gt ON r.REQUESTITEMID = gt.REQUESTITEMID

  LEFT OUTER JOIN SYMBOLICAMOUNTTYPE st ON st.SYMBOLICAMOUNTTYPEID = gt.SYMBOLICAMOUNTTYPEID

  LEFT OUTER JOIN PAYCODE pc ON pc.PAYCODEID = gt.PAYCODEID

  LEFT OUTER JOIN REQITEMAPPROVAL ri ON ri.REQUESTITEMID = r.REQUESTITEMID

  LEFT OUTER JOIN VP_ALLPERSONV42 p3 ON p3.PERSONID = ri.APPROVERID

  LEFT OUTER JOIN REQSTATCHANGE rsc ON rsc.REQUESTITEMID = r.REQUESTITEMID

  LEFT OUTER JOIN VP_ALLPERSONV42 p4 ON p4.PERSONID = rsc.USERACCOUNTID

WHERE R.REQUESTSTATUSID = '4'

AND R.STARTDTM BETWEEN SYSDATE-7 AND SYSDATE

OR R.ENDDTM BETWEEN SYSDATE-7 AND SYSDATE

ORDER BY p.PERSONNUM, RS.REQUESTSTATUSNM, R.STARTDTM;

现在虽然我没有收到任何错误,但我无法从所述查询中检索任何数据。

【问题讨论】:

  • 首先,格式化您的代码,使其可读。其次,Oracle 中没有 DATEADD 函数。这是来自 sql server 的吗?

标签: sql oracle


【解决方案1】:

Oracle 中没有dateadd;使用这样的东西(只需减去 7 天):

AND (    r.startdtm BETWEEN current_timestamp - 7 AND current_timestamp
      OR r.enddtm   BETWEEN current_timestamp - 7 AND current_timestamp 
    )

例如:

SQL> select current_timestamp - 7             res_1,
  2   trunc(current_timestamp - 7) res_2
  3  from dual;

RES_1               RES_2
------------------- -------------------
23.11.2021 21:49:53 23.11.2021 00:00:00

SQL>

如您所见,结果包含时间分量。如果您使用的列被截断(因此时间设置为午夜),您可能还希望将trunc 函数应用于current_timestamp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2022-01-22
    • 2011-08-27
    • 2011-04-21
    • 2019-06-29
    • 2013-10-20
    相关资源
    最近更新 更多