Формат даты и получение результатов за последние 24 часа
Я новичок в 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
выглядит так: 7686745377
Данные из внешности CCDBA.O_PAT.ORDER_DDT
вот так после конвертации с использованием ddt.tochar: 02/20/14 09:58
1 ответ
Вам не нужно конвертировать дату в строку и обратно, чтобы сравнить даты. Упростите условие:
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;