Исправить проблему с датой в файле .csv с помощью utl_file

Я использую utl_file для записи в файл csv. Данные также включают столбцы даты. Проблема здесь

Для однозначного дня 0 удаляется, когда данные вставляются в файл csv. Например, дата 07 июня 13 вставляется как 7 июня 13, как я могу гарантировать, что 0 останется?

Я уже to_char и concat "", но все равно получаю только однозначную дату. Генерируемый CSV-файл используется сторонней системой, поэтому в файл csv нельзя внести изменения.

Я использую EBS 12.1.3.

Спасибо

Фрагмент кода PL/SQL

   concat(concat('"',lv_proj_start_date),'"')    ||','||
   concat(concat('"',lv_proj_start_date_plus_1),'"')     ||','||

Я ожидаю вывод даты в CSV, например 07-Jun-13

но в файле csv o/p равен 7-Jun-13.


person user3436389    schedule 28.05.2019    source источник
comment
Написание CSV-файлов немного сложнее, чем вы думаете. Я бы рекомендовал использовать готовое решение, например эту процедуру, которую я поддерживаю.   -  person Jon Heller    schedule 29.05.2019


Ответы (1)


Предполагая, что оба столбца имеют формат DATE, вам необходимо явно преобразовать дату в любой желаемый формат, например:

'"' || to_char(lv_proj_start_date, 'dd-Mon-yy', 'nls_date_language=english') || '","' 
    || to_char(lv_proj_start_date_plus_1, 'dd-Mon-yy', 'nls_date_language=english') || '",'

Н.Б. Я также преобразовал ваши вызовы функций CONCAT для использования оператора конкатенации ||, так как его намного легче читать. Я также объединил текстовые строки, где это возможно.

Я также использовал необязательный третий параметр to_char(), чтобы явно установить английский язык даты, что делает его независимым от NLS.

Последнее замечание: вам обязательно нужно выводить даты с двузначным годом? В настоящее время предпочтение отдается 4-значным цифрам, после Y2K!


ETA: Вот пример, показывающий, что вывод правильный:

DECLARE
  lv_proj_start_date DATE := to_date('07/07/2019', 'dd/mm/yyyy');
  lv_proj_start_date_plus_1 DATE := lv_proj_start_date + 1;

  v_str VARCHAR2(4000);
BEGIN
  v_str := '"Testing","' || to_char(lv_proj_start_date, 'dd-Mon-yy', 'nls_date_language=english') || '","' 
                          || to_char(lv_proj_start_date_plus_1, 'dd-Mon-yy', 'nls_date_language=english') || '"';

  dbms_output.put_line(v_str);
END;
/

"Testing","07-Jul-19","08-Jul-19"
person Boneist    schedule 28.05.2019
comment
Спасибо, Boneist, позвольте мне попытаться вернуться к вам. - person user3436389; 28.05.2019
comment
Привет Boneist, у меня есть еще одно сомнение. Пользователь спрашивает, соответствует ли сгенерированный CSV-файл указанным ниже свойствам. Свойства CSV: Кодировка символов: UTF-8 Символ в кавычках: " (Двойные кавычки) Разделитель: , (Запятая) Строка заголовка: 1 (Обязательно) Экранирующий символ: Обратная косая черта Разделитель с множественным выбором: Точка с запятой. Не могли бы вы сообщить мне, как мы можем обеспечить и проверить это? - person user3436389; 28.05.2019
comment
кодировка символов будет зависеть от набора символов вашей базы данных. Что касается других, у вас есть возможность вывести каждую строку с необходимыми разделителями и т.д... - person Boneist; 28.05.2019
comment
Пробовал, не помогло, в csv отображается только 7 июля 13. - person user3436389; 28.05.2019