#sql #oracle
#sql #Oracle
Вопрос:
У меня проблема в моем запросе в том, что я всегда получаю ошибку такого рода
ORA-01722: invalid number
Что бы я ни пытался, это не работает.
Запрос находится здесь
SELECT * FROM
(
SELECT p.ProjectID, p.CustomName, p.Name
FROM projects p
INNER JOIN
users u
ON
u.UserID = 1
WHERE
u.User_roleID = 1
UNION
SELECT p.ProjectID, p.CustomName, p.Name
FROM projects p
WHERE
(p.Responsible_person_id = 1 OR p.Delivery_contact = 1)
AND
(SYSTIMESTAMP BETWEEN TO_DATE(p.StartDate,'YYYY-MON-DD') AND TO_DATE(p.EndDate,'YYYY-MON-DD'))
AND
p.status = 2
UNION
SELECT rs.ProjectID, pr.CustomName, pr.Name
FROM
responsible_persons rs
LEFT JOIN
projects pr
ON
pr.ProjectID = rs.ProjectID
WHERE
rs.UserID = 1
AND
(SYSTIMESTAMP BETWEEN TO_DATE(pr.StartDate,'YYYY-MON-DD') AND TO_DATE(pr.EndDate,'YYYY-MON-DD'))
AND
pr.status = 2
UNION
SELECT p.ProjectID, p.CustomName, p.Name
FROM project_users_schedule_dates pusd
LEFT JOIN projects p
ON
p.ProjectID = pusd.ProjectID
WHERE pusd.UserID = 1
AND
(SYSTIMESTAMP BETWEEN TO_DATE(pusd.StartDate,'YYYY-MON-DD')
AND
TO_DATE(pusd.EndDate, 'YYYY-MON-DD'))
AND
p.status = 2) a
-- GROUP BY a.ProjectID
ORDER BY a.CustomName, a.ProjectID
Поскольку здесь StartDate
и EndDate
есть VARCHAR2
, мне нужно преобразовать в_дату, но я понятия не имею, что не так, что я всегда получаю ошибку.
Формат, в котором я сохраняю дату, является 'YYYY-MM-DD'
Где я допустил ошибку? Что здесь не так?
Комментарии:
1. Никогда не сохраняйте значения ДАТЫ (или метки времени) в
varchar
столбцах.2. Какие типы данных являются
userid
иstatus
?3. Я знаю, что это большая ошибка, и это не мой сбой. Мой коллега по установке Oracle SQL и таблиц допустил эту ошибку. Я уже понял, что это очень, очень большая ошибка
4. В более общем плане, у вас есть
UNION
из четырех (на первый взгляд) отдельных блоков … попробуйте выполнить запрос только с одним за раз, чтобы определить, какой из них вызывает проблему.5. Формат, в котором я храню дату, ‘ГГГГ-ММ-ДД’ , но запрос использует
'YYYY-MON-DD'
.
Ответ №1:
Переменная Responsible_person_id и параметр Delivery_contact также являются переменными
Затем сравните их со строками, а не с числами.
(p.Responsible_person_id = '1' OR p.Delivery_contact = '1')
Если вы сравниваете их с числами, Oracle пытается преобразовать значения столбцов в число, и ошибка указывает на то, что не все значения по крайней мере в одном из этих столбцов являются правильными числами.
Если предполагается, что они содержат числа, они должны быть определены с NUMBER
типом.