1

我是 SQL 新手,我对下面的查询有疑问。我需要返回过去 24 小时内输入的订单会话,如果我没有最后一条语句,查询将返回所有订单会话,但我只需要过去 24 小时内的订单会话。CCDBA.O_PAT.ORDER_DDT 不是 Oracle 日期,而是需要使用 ddt.tochar 将其转换为可读日期的数字。

SELECT DISTINCT
         CCDBA.O_PAT.SESSION_ID, 
         CCDBA.PATIENT.MEDREC_ID "MRN",
         CCDBA.PATIENT.VISIT_NUMBER "Account Number",
         CCDBA.PATIENT.LAST_NAME || ', ' || CCDBA.PATIENT.FIRST_NAME "Patient",
         CCDBA.PATIENT.DEPT_ID "Floor",
         CCDBA.PATIENT.ROOM_ID "Room",
         ddt.tochar(CCDBA.O_PAT.ORDER_DDT) "Order Date"
  FROM CCDBA.PATIENT
 INNER JOIN CCDBA.O_PAT ON CCDBA.O_PAT.PAT_SEQ = CCDBA.PATIENT.PAT_SEQ
 WHERE CCDBA.O_PAT.ORDER_ID = '681278'
  AND TO_DATE(ddt.tochar(CCDBA.O_PAT.ORDER_DDT), 'DD-MON-YY HH24:MI:SS')
        >= SYSDATE -1;

我收到以下错误:

ORA-01843: not a valid month
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

原始数据CCDBA.O_PAT.ORDER_DDT如下所示:使用 ddt.tochar 转换后7686745377 的数据如下:CCDBA.O_PAT.ORDER_DDT02/20/14 09:58

4

1 回答 1

0

您无需将日期转换为字符串并再次返回来比较日期。简化条件:

WHERE CCDBA.O_PAT.ORDER_ID = '681278' AND
      CCDBA.O_PAT.ORDER_DDT >= SYSDATE - 1;

此外,如果您正在学习 SQL,请学习使用表别名。生成的查询更易于编写和阅读:

SELECT DISTINCT o.SESSION_ID, 
       p.MEDREC_ID  as "MRN",
       p.VISIT_NUMBER as "Account Number",
       p.LAST_NAME || ', ' || p.FIRST_NAME as "Patient",
       p.DEPT_ID as "Floor",
       p.ROOM_ID as "Room",
       ddt.tochar(o.ORDER_DDT) as "Order Date"
FROM CCDBA.PATIENT p INNER JOIN
     CCDBA.O_PAT o
     ON o.PAT_SEQ = p.PAT_SEQ
WHERE o.ORDER_ID = '681278' AND c.ORDER_DDT >= SYSDATE - 1;

而且,如果您不需要DISTINCT,请不要使用它。它只是在不需要时浪费处理时间。

编辑:

对于修改后的日期格式:

WHERE CCDBA.O_PAT.ORDER_ID = '681278' AND
      TO_DATE(ddt.tochar(CCDBA.O_PAT.ORDER_DDT),
              'MM/DD/YYYY HH24:MI') >= sysdate - 1;
于 2015-08-22T14:34:06.050 回答