【问题标题】:Issue with date format output in OracleOracle 中的日期格式输出问题
【发布时间】:2019-08-25 03:30:05
【问题描述】:

我有一个要求,我必须将日期字段插入 varchar 列。我直接将记录插入表中,没有任何类型转换。在一个环境中,它插入为 29-AUG-16,而在另一个环境中,它存储为 29-08-2016。因此,我对数据的后续处理失败了。我期望在这两种环境中的数据都是 DD-MON-RR。在这两种环境中,nls 格式在 nls 会话参数表中都是 DD-MON-RR。两种环境不同的原因是什么? 我尝试使用 TO_CHAR(DATECOL, 'DD-MON-RR') 进行类型转换,但数据仍以 dd-mm-yyyy 格式插入

【问题讨论】:

  • “将日期字段插入 varchar 列的要求”。只是想知道,为什么?
  • 因为我们使用日期创建主键并与其他关键字段连接。
  • 您正在创建一个额外的列,其中包含来自其他列的连接值 - 并将其作为主键;而不是在原始列中使用复合主键?似乎有点奇怪......无论如何,您不应该依赖 NLS 设置,并且您实际执行插入的方式可能会忽略它们 - 例如,您从中获取日期值(它可能是早于你认为?),以及正在发生什么绑定或显式/隐式转换。
  • 请包含完整的插入语句,以及表的 DDL,或者至少包含列的实际数据类型和您正在使用的任何变量。

标签: sql oracle date nls


【解决方案1】:

您可以使用TO_CHAR函数将日期转换为字符并插入到varchar列中。

您应该在插入查询中使用类似这样的内容,而不是简单地编写 date_column

INSERT INTO date_tab VALUES(TO_CHAR(date_col, 'DD-MON-YY'))

【讨论】:

    【解决方案2】:

    根据服务器默认值、客户端默认值和显式会话设置为每个会话设置 NLS 值。因此,如果您想要所有会话的标准格式,您必须在操作级别设置所需的 NLS 以覆盖所有可能的(几乎不可预测的)NLS 结果组合。在to_char 函数中,您应该将第三个参数 (NLS) 设置为您选择的 NLS 日期格式。

    【讨论】:

    • 我尝试使用 TO_CHAR(DATECOL, 'DD-MON-RR') 插入。但是,由于未知原因,仍然以 mm-dd-yyyy 格式插入值
    • 尝试第三个参数to_char(datecol, 'DD-MON-RR', 'NLS_DATE_LANGUAGE=english')。另一方面,我想知道是否涉及触发器。
    • 谢谢。但这没有帮助,也没有涉及触发器。我在 Dev 中运行良好但在更高环境中运行良好的查询
    • 如果使用显式 TO_CHAR(datecol, 'DD-MON-RR'),几乎不可能将值插入为 mm-dd-yyyy。您应该仔细检查您的代码。特别是,请确保不要错误地使用 TO_DATE 或在源或目标中使用错误的列类型。
    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多