ORA-01481: недопустимая модель формата чисел

#oracle #function #plsql

#Oracle #функция #plsql

Вопрос:

Я пытаюсь понять, что здесь произошло, но почему-то не могу. Что бы я ни пробовал снова и снова, я получаю ошибку. Сообщение об ошибке, которое я получаю, является :

 ORA-01481: invalid number format model
01481. 00000 -  "invalid number format model"
*Cause:    The user is attempting to either convert a number to a string
           via TO_CHAR or a string to a number via TO_NUMBER and has
           supplied an invalid number format model parameter.
*Action:   Consult your manual.
  

Пока то, что я пытаюсь сделать, находится здесь

 SELECT
            A.UserID, 
            A.Surname, 
            A.Lastname,
            A.PersonalNumber,
            A.EmployeeNumber, 
            (SELECT TO_CHAR(SUM(um.Mileage), 1) from user_mileages um 
            INNER JOIN user_timesheets ut 
            ON um.TimesheetId = ut.UserTimesheetsID
            WHERE ut.Date_ BETWEEN '2020-02-24' AND '2020-06-06'
            AND um.UserId = A.UserID ) AS sum_mileage_per_month,
            A.UserTimesheetsID,
            A.User_roleID,
            ROW_NUMBER() OVER(ORDER BY A.UserID) AS RowNumber
         FROM (
         SELECT 
            u.UserID, 
            u.Surname, 
            u.Lastname,
            u.User_roleID,
            u.PersonalNumber,
            u.EmployeeNumber, 
            (um.Mileage),
            ut.UserTimesheetsID
         FROM 
            users  u
         LEFT JOIN 
            user_timesheets  ut 
         ON 
            ut.user_id = u.UserID
         LEFT JOIN
            user_mileages  um
         ON
            (ut.UserTimesheetsID = um.TimesheetId AND ut.user_id = um.UserId)
         WHERE 
            ut.Date_ BETWEEN '2020-02-24' AND '2020-06-06' 
         UNION
            SELECT u.UserID, 
                    u.Surname, 
                    u.Lastname, 
                    u.User_roleID, 
                    u.PersonalNumber, 
                    u.EmployeeNumber, 
                    NULL AS Mileage,
                    NULL AS UserTimesheetsID 
            FROM users  u
         ) A
         ORDER BY A.EmployeeNumber, A.Surname, A.Lastname
  

Пока ошибка в

 (SELECT TO_CHAR(SUM(um.Mileage), 1) from user_mileages um 
  

Здесь um.Mileage поле является типом данных с плавающей запятой, и, насколько я пытаюсь преобразовать в TO_CHAR и TO_NUMBER и используя CAST , но пока ни одно решение не работает.
Что здесь не так? Почему я не могу преобразовать это в символ или в число?

Ответ №1:

Вы можете попробовать это:

 SELECT TO_CHAR(SUM(um.Mileage)) FROM table_name;
SELECT TO_NUMBER(SUM(um.Mileage)) FROM table_name;
  

Ошибка:

 SELECT TO_CHAR(SUM(um.Mileage), 1) FROM table_name;
ORA-01481: invalid number format model
  

Ответ №2:

Вы пытаетесь сравнить значение даты ut.Date_ со значением varchar2 '2020-02-24' . Вместо этого сравните типы дат с типами дат.

В этом случае вы могли бы использовать литерал и стать ut.Date_ BETWEEN date '2020-02-24' AND date '2020-06-06' . Если вам также нужен раздел времени для сравнения, используйте функцию to_date().

Надеюсь, это решит вашу проблему.

Комментарии:

1. Нет, это не soulution. Все еще есть проблема

2. У вас дважды возникает ситуация в вашем SQL-запросе, вы изменили ее 2 раза? Добавьте литерал даты в обеих ситуациях (строки 10 и 36 в приведенном выше запросе)

3. Да, я меняю ее 2 раза, но проблема все еще есть. Как я вижу, проблема в том (ВЫБЕРИТЕ TO_CHAR (SUM (um.Mileage), 1), поскольку я комментирую эту строку кода, и она возвращает мне данные, но когда я раскомментирую ее, я получаю ошибку

4. to_char( sum( um.Mileage), 1) ?? Что вы пытаетесь здесь сделать? Разве это не должно быть просто SELECT TO_CHAR(SUM(um.Mileage)) ?

5. Каков тип данных столбца um.mileage ?