【问题标题】:Change timestamp format in oracle在 oracle 中更改时间戳格式
【发布时间】:2021-05-19 14:24:58
【问题描述】:

我从 oracle 获取时间戳格式为 '01-APR-21 12.02.00.496677000 AM',我想更改格式以将数据加载到数据类型为 datetime 的 sql server 列中。

当前输入:'01-APR-21 12.02.00.496677000 AM' 预期输出:2021-04-01 12:02:00.496

我需要在 oracle 中编写代码来更改时间戳格式

谢谢 尼哈

【问题讨论】:

  • 默认格式由会话的nls_timestamp_format 定义。您可以为当前会话更改它,但如果您将时间戳移动到不同的数据库,您关心时间戳的显示格式似乎很奇怪。任何 ETL 工具都应该只将数据从 timestamp 列移动到 datetime,而不用担心如果它想要将 timestamp 隐式转换为 varchar2,当前会话将使用什么格式。跨度>
  • 我无法更改 oracle 数据库中的任何内容,因为它不属于我们。我没有使用任何 ETL 工具,我必须通过 mule4 将数据加载到不同的数据库中
  • 您可以更改会话设置,这不会更改数据库中的任何内容。如果您正在编写自己的 ETL 流程来提取数据,那么您需要解释您是如何做到的。例如,如果您正在查询一个表并将输出写入一个文本文件以供您稍后加载到 SQL Server 中,那么您可以设置会话的格式,或者使用 to_char() 以及每个日期所需的格式/时间戳列。但我们需要知道您在做什么才能为您提供帮助。
  • MuleSoft 似乎不太可能无法从 Oracle 数据库中获取 timestamp 并将其移动到 SQL Server 中的 datetime 而无需将 timestamp 隐式转换为 @987654330 @。当然,您可以在timestamp 上执行明确的to_char 以将其转换为您想要的任何格式的字符串。但是,再一次,这一步似乎不太必要。
  • 重点是格式是一种输出属性,不是数据本身固有的。您可以更改会话(这不会更改数据库)以更改默认输出格式,或者您可以使用 to_char 更改查询中的输出格式,但这些只会影响数据的显示方式为人物。将数据从 Oracle 中的 timestamp 迁移到 SQL Server 中的 datetime 不应该关心字符格式输出; ETL 工具应该能够执行从一种数据类型到另一种数据类型的直接转换。

标签: oracle


【解决方案1】:

TIMESTAMP 是一种二进制数据格式,包含 7-20 个字节(世纪、世纪、月、日、小时、分钟、秒,小数秒最多 6 个字节,小数秒最多 7 个字节)时区信息);它确实没有有格式。

为什么我看到 TIMESTAMP 的格式?

您看到它是有格式的,因为无论您使用什么用户界面来访问数据库,都决定将二进制信息显示为格式化字符串而不是返回原始字节更有用对你的价值观。

通常,对于 SQL/Plus 和 SQL Developer,这是由 NLS_TIMESTAMP_FORMAT 会话参数管理的。其他用户界面将有不同的机制来管理日期和时间戳的默认格式。

如果您想更改 SQL/Plus(和 SQl Developer)的默认值,那么您可以使用:

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF9';

(或任何你喜欢的格式。)

如何格式化TIMESTAMP 值?

如果您想显示时间戳的格式(请记住,TIMESTAMP 不会以任何格式存储)然后您想使用TO_CHAR 将其转换为字符串,其中它可以有一个格式。

如果您想将TIMESTAMP 格式化为YYYY-MM-DD HH24:MI:SS.FF3 字符串,请使用:

SELECT TO_CHAR( your_timestamp_column, 'YYYY-MM-DD HH24:MI:SS.FF3' )
FROM   your_table

如何将格式化字符串转换回TIMESTAMP

来自您的评论:

我将 oracle 数据加载到另一个 SQL 表中,其中日期格式为 varchar,数据加载为 '01-APR-21 12.02.00.496677000 AM'

使用TO_TIMESTAMP:

SELECT TO_TIMESTAMP( your_string_column, 'DD-MON-RR HH12:MI:SS.FF9 AM' )
FROM   your_table

(注意:这会将您的字符串转换为二进制TIMESTAMP,然后您使用的任何用户界面都将使用其规则来显示它;如果它使用的默认格式是@987654336 @ 那么上面的查询看起来好像什么也没做;它确实做了,UI 只是隐式地将它转换回字符串以显示它。)

【讨论】:

  • TO_CHAR( '01-APR-21 12.02.00.496677000 AM', 'YYYY-MM-DD HH24:MI:SS.FF3' ) 不工作,我收到 ORA-01722 错误:无效号码
  • @NehaSingh - '01-APR-21 12.02.00.496677000 AM' 是字符串而不是时间戳。正如 MTO 所说,表达式是将实际时间戳转换为字符串。使用select to_timestamp() 语句转换另一种方式。
  • 谢谢 MTO 和 Alex
猜你喜欢
  • 2011-11-01
  • 2018-11-27
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多