ORA-01830 при преобразовании числа в слова

Высокое значение в десятичном формате, например - 100.10, я хочу преобразовать его в слово, поэтому я пишу ниже скрипт, но не получаю его выполнения.

SELECT SYMBOL, HIGH, UPPER(TO_CHAR(TO_DATE(HIGH,'J'),'JSP'))
AMT_IN_WORDS FROM BHAV; 

получение ошибки

ORA-01830

пожалуйста, исправьте это где ошибаюсь ....

Заранее спасибо...

Тебе нужно кричать чуть громче, мы тебя не слышим.

Joakim Danielson 14.04.2018 16:32

Я избавил вас от дальнейших отрицательных голосов .. Всегда помните, не используйте заглавные буквы, задавая вопросы. Это считается криком.

Kaushik Nayak 14.04.2018 17:03
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
174
2

Ответы 2

Ошибка возникает, поскольку значение high, которое вы показали, является десятичным числом, которое не может быть неявно преобразовано в целое число, в отличие от 100.00. Таким образом, его нельзя преобразовать в дату по юлианскому календарю.

SELECT  UPPER(TO_CHAR(TO_DATE(100.10,'J'),'JSP'))AMT_IN_WORDS FROM DUAL;

Это вызывает

ORA-01830: date format picture ends before converting entire input string

Эту проблему можно решить округлением десятичной дроби до ближайшего целого числа.

SELECT  UPPER(TO_CHAR(TO_DATE(ROUND(100.10),'J'),'JSP'))AMT_IN_WORDS FROM DUAL;

| AMT_IN_WORDS |
|--------------|
|  ONE HUNDRED |

Демо

Если вам действительно нужен компонент с плавающей запятой, хотя и ограниченный, вы можете сослаться на этот ответ EDIT2: Как преобразовать числа в слова - ORACLE

есть ли другой способ преобразования значения и десятичного значения в слова ??

N. kotadia 16.04.2018 19:32

@ N.kotadia: Вы сослались на ответ в ссылке, которой я поделился в конце?

Kaushik Nayak 16.04.2018 19:39

Вы можете создать функцию.

CREATE OR REPLACE FUNCTION big_amt_in_words (p_input VARCHAR2) RETURN VARCHAR2
IS
   v_running_input NUMBER;
   v_num NUMBER;
   v_amt_in_words VARCHAR2(2000);
BEGIN
   v_running_input := P_input;
   FOR i IN (
             SELECT RPAD(1, (rownum*3)+1, 0) num_value,
                    CASE LENGTH(RPAD(1, (rownum*3)+1, 0))
                        WHEN 4 THEN 'THOUSAND'
                        WHEN 7 THEN 'MILLION'
                        WHEN 10 THEN 'BILLION'
                        WHEN 13 THEN 'TRILLION'
                        WHEN 16 THEN 'QUADRILLION'
                        WHEN 19 THEN 'QUINTILLION'
                        WHEN 22 THEN 'SEXTILLION'
                        WHEN 25 THEN 'SEPTILLION'
                        WHEN 28 THEN 'OCTILLION'
                    END place_value
              FROM DUAL
           CONNECT BY rownum < 10
             ORDER BY rownum desc)
    LOOP
        v_num := TRUNC(v_running_input/i.num_value,0);
        IF v_num > 0 THEN
            v_amt_in_words := v_amt_in_words||' '||TO_CHAR(TO_DATE(v_num,'J'), 'JSP')||' '||i.place_value;
            v_running_input := v_running_input - (v_num * i.num_value);
        END IF;
    END LOOP;
    v_amt_in_words := v_amt_in_words||' '||TO_CHAR(TO_DATE(TRUNC(v_running_input),'J'), 'JSP')
                      ||' AND '||UPPER(TO_CHAR(TO_DATE((ROUND(v_running_input-TRUNC(v_running_input),2)*100),'J'),'JSP'))||' CENTS';
    RETURN TRIM(v_amt_in_words);
END;
/

Чтобы использовать это,

SELECT BIG_AMT_IN_WORDS(65763245345658.12) amt_in_words 
  FROM DUAL;

Output
---------------------------------------------
SIXTY-FIVE TRILLION SEVEN HUNDRED SIXTY-THREE BILLION TWO HUNDRED FORTY-FIVE MILLION THREE HUNDRED FORTY-FIVE THOUSAND SIX HUNDRED FIFTY-EIGHT AND TWELVE CENTS

Другие вопросы по теме