Недопустимый номер ORA-01722

#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 типом.