对 CSV 文件 Oracle 12C 的 SPOOLING SQL SELECT 语句 - 如果不在最右侧,日期列显示为空白

SPOOLING SQL SELECT statement to CSV File Oracle 12C - Date column comes out blank if not at far right hand side

我正在努力将每天完成的一些报告系统化,我创建了 sql select 报表,其中 return 需要的数据,我现在希望获得这些 运行隔夜并保存到一个位置。

我们将文件导出并保存为带有“|”分隔符的 CSV 格式的单个字符串,如果我在其他列之间有一个日期,则使用这种方法,此日期列将变为空白。如果我使用 to_char(date, 'YYYYMMDD') 将其格式化为字符串,那么它将正常工作,但是要在 Excel 或类似格式中进一步使用它,用户将需要转换此日期。如果我在最后一列上有这个日期字段,即更靠右的那一列,那么日期会按预期导出而不转换为字符串。

谁能告诉我为什么会这样,以及是否有办法将日期信息与两边的其他列一起显示?

我们当前使用的代码以正确的顺序生成列,但需要转换日期

WHENEVER OSERROR EXIT FAILURE ROLLBACK;
SET SERVEROUTPUT ON SIZE 100000
WHENEVER SQLERROR EXIT SQL.SQLCODE;

SET TERMOUT OFF
SET HEADING OFF
SET TRIMSPOOL ON
SET FEEDBACK OFF
SET ECHO OFF
SET PAGESIZE 40000
SET LINESIZE 2000
SET NEWPAGE NONE

COLUMN filename    NEW_VAL filename
 SELECT 'FILEoutput'||TO_CHAR (SYSDATE, 'YYYYMMDD')||'.txt' filename
   FROM dual;
SPOOL /data/out/&filename
    select 'SKU'||'|'||'DATE'||'|'||'QTY'||'|'||'SEG' from dual;
        select dat.SKU ||'|'|| TO_CHAR (TRUNC (dat.date), 'YYYYMMDD') ||'|'|| dat.qty ||'|'|| dat.Seg 
        from scpomgr.dat;
SPOOL OFF;
EXIT;

如果我删除 to_char 然后我得到一个空白列:

COLUMN filename    NEW_VAL filename
 SELECT 'FILEoutput'||TO_CHAR (SYSDATE, 'YYYYMMDD')||'.txt' filename
   FROM dual;
SPOOL /data/out/&filename
    select 'SKU'||'|'||'DATE'||'|'||'QTY'||'|'||'SEG' from dual;
        select dat.SKU ||'|'|| TRUNC (dat.date) ||'|'|| dat.qty ||'|'|| dat.Seg 
        from scpomgr.dat;
SPOOL OFF;
EXIT;

但是如果我把日期放在右边,它就会正确显示:

COLUMN filename    NEW_VAL filename
 SELECT 'FILEoutput'||TO_CHAR (SYSDATE, 'YYYYMMDD')||'.txt' filename
   FROM dual;
SPOOL /data/out/&filename
    select 'SKU'||'|'||'QTY'||'|'||'SEG'||'|'||'DATE' from dual;
        select dat.SKU ||'|'|| dat.QTY  ||'|'|| dat.SEG ||'|'|| TRUNC (dat.date)
        from scpomgr.dat;
SPOOL OFF;
EXIT;

这些问题只有在我 运行 导出作业并查看 CSV 时才会发现,如果我只是 运行 这些 select 语句,一切看起来都正常。

我们正在使用 Oracle 12C

我已经尝试使用谷歌搜索并寻找答案,但未能成功找到相同的情况 - 非常感谢对此的任何帮助或指导,

使用代码

TO_CHAR (TRUNC (dat.date), 'DD/MM/YYYY') 

然后正确显示数据并允许将列放在其他列之间而不是放在最后,这解决了原始问题。