【发布时间】:2013-04-25 14:38:37
【问题描述】:
在 SQL Plus 输出中,它占用的空间比它需要的要多得多,我想将它从 50 个字符减少到 20 个。
【问题讨论】:
-
你的意思是在 SQLPlus 输出中吗?
-
好的,谢谢。
标签: sql oracle timestamp width sqlplus
在 SQL Plus 输出中,它占用的空间比它需要的要多得多,我想将它从 50 个字符减少到 20 个。
【问题讨论】:
标签: sql oracle timestamp width sqlplus
如果将宽度减小到 20,则默认的 TIMESTAMP 或 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 格式代码在here 中列出。
请注意,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
【讨论】:
COLUMN ts... 位。我认为这可能是为了让A20 使用默认格式包装(我的答案中的第一个示例)但在设置新的时间戳格式后没有这样做。不管是什么原因,你绝对可以忽略它。
只是对上述 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 切断了输出,但仍然将输出填充到定义的列大小。
【讨论】: