Как исправить ошибку «ORA-01801: формат даты слишком длинный для внутреннего буфера» в SQL в Oracle - PullRequest
1 голос
/ 20 апреля 2019

Я работаю над заданием, в котором мне нужно отображать системную дату очень специфическим способом в SQL.Форма должна выглядеть следующим образом:

День недели, в котором только первая буква заглавной, номер месяца римскими цифрами (заглавными буквами), день месяца, год, прописные прописными буквами сanno domini, день года по юлианскому календарю с фразой «День года», количество секунд после полуночи с фразой «Секунды после полуночи»

Я достиг фактического количества секундпосле полуночи, но я не могу добавить к нему слова «Секунды за полночь».

Я искал синтаксис в Интернете и не нашел точно того, что мне было нужно.Возможно, мои поисковые запросы были неверно сформулированы или что я недостаточно далеко заглянул.Мой учебник мне тоже не совсем понятен.Единственное, что я там видел, это объяснение разницы между CURRENTDATE и SYSDATE.

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

SELECT TO_CHAR
    (SYSDATE, 'Dy, RM, D, YEAR AD, DDD "Day of the year", SSSSS "Seconds past midnight") "NOW"
     FROM DUAL;

Я ожидал, что результат выдаст Fri, IV, 19, TWENTY NINETEEN AD, 109 Day of the year, 73829 Seconds past midnight, но он выдаст мне следующую ошибку: ORA-01801: date format is too long for internal buffer

1 Ответ

2 голосов
/ 20 апреля 2019

Вы можете обмануть - объединить последний жестко закодированный текст с результатом TO_CHAR, вместо того, чтобы включать его в модель формата.

SELECT TO_CHAR(SYSDATE, 'Dy, RM, DD, YEAR AD, DDD "Day of the year ", SSSSS')
       || ' Seconds past midnight' "NOW"
FROM DUAL;



NOW
----------------------------------------------------------------------------------
Fri, IV  , 19, TWENTY NINETEEN AD, 109 Day of the year , 54236 Seconds past midnight

Обратите внимание, что третий элемент формата должен быть DD (у вас есть D, который не даст вам двухзначный день месяца, в данном случае 19).

Дополнительные разъяснения по полученной ошибке: Это написано в документации Oracle

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Format-Models.html#GUID-49B32A81-0904-433E-B7FE-51606672183A

Общая длина модели формата datetime не может превышать 22 символы.

Однако быстрый подсчет показывает, что длина модели формата в моем решении на самом деле превышает 22 символа. Документация Oracle нередко бывает неправильной. В этом случае, кажется, есть ограничение на длину модели формата, хотя это не то, что в документации ...

...