#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
?