对 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')
然后正确显示数据并允许将列放在其他列之间而不是放在最后,这解决了原始问题。
我正在努力将每天完成的一些报告系统化,我创建了 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')
然后正确显示数据并允许将列放在其他列之间而不是放在最后,这解决了原始问题。