在 SQL Plus 输出中,它占用的空间比它需要的要多得多,我想将它从 50 个字符减少到 20 个。
3 回答
TIMESTAMP
如果将宽度减小到 20,则对于默认值或TIMESTAMP WITH TIME ZONE
格式将不够宽。发生这种情况时,SQLPlus 将包装该值。
假设表b
有时间戳列TS
:
COLUMN ts FORMAT A20
SELECT ts FROM b;
TS
--------------------
25-APR-13 11.28.40.1
50000 AM
要进一步缩小宽度,请确定您想要的信息并相应地格式化。Oracle DateTime 和 Timestamp 格式代码在此处列出。
请注意,SQLPlus 不允许您在COLUMN
语句中指定日期格式。这就是我在FORMAT A20
上面使用的原因。如果您删除小数秒并使用 24 小时制而不是 AM/PM 并删除时区,则可以将其变为 19 个字符:
COLUMN TSFormatted FORMAT A20
SELECT TO_CHAR(ts, 'MM/DD/YYYY HH24:MI:SS') AS TSFormatted FROM b;
TSFORMATTED
--------------------
04/25/2013 11:28:40
如果您愿意放弃世纪,您可以获得两个小数秒和 20 的精确宽度:
COLUMN TSFormatted FORMAT A20
SELECT TO_CHAR(ts, 'MM/DD/YY HH24:MI:SS.FF2') AS TSFormatted from b;
TSFORMATTED
--------------------
04/25/13 11:28:40.15
最后,如果您希望以某种方式自动格式化所有时间戳,请使用ALTER SESSION
:
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'MM/DD/YY HH24:MI:SS.FF2';
COLUMN ts FORMAT A20
SELECT ts from b; -- don't need to_char because of the default format
TS
--------------------
04/25/13 11:28:40.15
只是对上面 Ed Gibbs 答案的简短扩展。出于调试目的,我将这个简单的 LOGIN.SQL 文件放在一起:
alter session set container = XEPDB1;
alter session set time_zone = 'Europe/Budapest';
alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS.FF1';
alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF1';
set pagesize 9999;
set linesize 9999;
set long 9999;
show linesize pagesize long user;
column added format a22;
column modified format a22;
column deleted format a22;
column localtimestamp format a22;
select localtimestamp from dual;
“添加”、“修改”和“删除”这些名称是我的模式中的常见列名,它们始终包含时间戳值。现在,当我启动 SQL*Plus 时,我看到(中间有几行空行):
SQL*Plus: Release 18.0.0.0.0 - Production on Fri Jul 10 13:25:52 2020
Version 18.4.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Last Successful login time: Fri Jul 10 2020 13:14:09 +00:00
Connected to:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
Session altered.
Session altered.
Session altered.
Session altered.
Session altered.
linesize 9999
pagesize 9999
long 9999
USER is "CURRENT_USER"
LOCALTIMESTAMP
----------------------
2020-07-10 15:25:53.2
SQL>
SUBSTR 函数有时会起作用,一旦您转换了时间戳(即 to_CHAR),但在 sqlplus 中指定一个列会给您更多控制:
例如:
列工资格式 $99,990
资源:
http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch6.htm
我有时会说 substr,因为我已经看到 sqlplus 切断了输出,但仍然将输出填充到定义的列大小。