【问题标题】:How can I reduce the width of column in Oracle (SQL Plus) with TIMESTAMP datatype?如何使用 TIMESTAMP 数据类型减少 Oracle (SQL Plus) 中的列宽度?
【发布时间】:2013-04-25 14:38:37
【问题描述】:

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

【问题讨论】:

  • 你的意思是在 SQLPlus 输出中吗?
  • 好的,谢谢。

标签: sql oracle timestamp width sqlplus


【解决方案1】:

如果将宽度减小到 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

【讨论】:

  • 绝妙的答案。我实际上意识到 20 太少了,发现 30 也可以。但是,你有一些很好的方法,我也将使用它们。 PS如果有人能给我更多的声望点,我可以在我刚加入时投票给答案,但还不能做任何事情。干杯。
  • 这很有帮助,但我不明白为什么在更改会话后需要“COLUMN ts FORMAT A20”。有没有办法让时间戳在会话范围内以 20 个字符显示,与格式无关?
  • 对不起@sf_jeff,但我很久以前就回答了这个问题,我不记得我为什么要输入COLUMN ts... 位。我认为这可能是为了让A20 使用默认格式包装(我的答案中的第一个示例)但在设置新的时间戳格式后没有这样做。不管是什么原因,你绝对可以忽略它。
【解决方案2】:

只是对上述 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>

【讨论】:

    【解决方案3】:

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

    例如:

    列工资格式 $99,990

    来源:

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

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

    【讨论】:

    • 好的,谢谢。按照“COLUMN column_name FORMAT A30 WORD_WRAPPED /”的查询解决了问题。
    • 很高兴为您提供帮助 - 在这种情况下,您能否为答案投票?
    • 嗨,我愿意,但我是新手,它说它没有声誉!想扔给我一根骨头,我会继续做的:-)
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2022-01-26
    • 2012-09-25
    • 1970-01-01
    • 2014-06-16
    • 2016-03-06
    • 1970-01-01
    相关资源
    最近更新 更多