【问题标题】:Select all columns with time formatting选择所有具有时间格式的列
【发布时间】:2020-01-22 08:11:54
【问题描述】:

我有很多列,其中一些包含时间戳。我想获取所有列记录,但要格式化的日期/时间:

我知道我可以单独获取所有列,但有 20 列,所以我想避免这样做:

select 
    id, 
    -- ... 19 other columns, 
    TO_CHAR(porh_received, 'YYYY-MM-DD HH24:MI:SS')
from pick_order_hist;

我希望是这样的:

select *, TO_CHAR(porh_received, 'YYYY-MM-DD HH24:MI:SS') from pick_order_hist;

但它不起作用。

【问题讨论】:

  • 您要避免做的是在 Oracle 中使用单个查询执行此操作的唯一方法。
  • 也许可以编写一些程序来接收所有列然后尝试进行格式化?我在 PL/SQL 方面有 0 经验
  • 。 .无论您在哪里输出它似乎都更简单。

标签: sql string oracle datetime


【解决方案1】:

选项 1

一种解决方案是将会话的 NLS 设置(控制返回时间戳的默认格式)更改为目标时间戳格式。根据您的实际数据类型,这可能是以下三种中的任何一种:

alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';
alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS';
alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

然后,您可以简单地这样做:

SELECT * FROM pick_order_hist;

这种方法的缺点是它会改变会话生命周期的默认格式(或者直到稍后更改为其他格式)。根据您的用例,这可能是您所需要的,也可能不是。

选项 2

否则,您可以使用* 获取所有列,然后使用结果集中的列别名添加格式化的时间戳列。因此,您只需列出时间戳列,而不是列出所有列。缺点是您在结果集中获得了一些额外的列,每个未格式化的时间戳都有一个列;您可以在您的应用程序中简单地忽略它们。

SELECT
    t.*, 
    TO_CHAR(porh_received, 'YYYY-MM-DD HH24:MI:SS') porh_received_with_format
FROM pick_order_hist t;

【讨论】:

  • 您在选项 #2 FROM 子句中缺少表别名。除此之外,+1。
  • @GMB,据我所知,Oracle 仍然不支持带有表别名的AS 关键字。
  • @AnkitBajpai:是的,你是对的,我刚刚测试过。帖子已编辑,感谢您的评论!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多