4

在 SQL Plus 输出中,它占用的空间比它需要的要多得多,我想将它从 50 个字符减少到 20 个。

4

3 回答 3

6

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
于 2013-04-25T15:36:59.873 回答
1

只是对上面 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>
于 2020-07-10T13:28:49.937 回答
0

SUBSTR 函数有时会起作用一旦您转换了时间戳(即 to_CHAR),但在 sqlplus 中指定一个列会给您更多控制:

例如:

列工资格式 $99,990

资源:

http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch6.htm

有时会说 substr,因为我已经看到 sqlplus 切断了输出,但仍然将输出填充到定义的列大小。

于 2013-04-25T15:06:44.507 回答