【问题标题】:Getting different year when converting a timestamp column to char using TO_CHAR使用 TO_CHAR 将时间戳列转换为 char 时获得不同的年份
【发布时间】:2020-04-26 00:14:08
【问题描述】:

这是来自 Oracle 12C,我什至尝试过在线 Oracle 编译器

有人能解释一下为什么会这样吗 以下是我正在遵循的简单步骤

-- 创建了一个 GTT。物理表也有问题

创建全局临时表 GTT_A ( b 时间戳(3));

-- 插入带有 1901 年的日期

插入 GTT_A 值('01-JAN-1901');

-- 检索时,直接列给出年份为 19,转换为 char 时给出 2019。对此是否有某种解释

从GTT_A中选择b,to_char(b,'mm-dd-yyyy');

【问题讨论】:

    标签: oracle oracle12c


    【解决方案1】:

    '01-JAN-1901' 不是时间戳,它是一个字符串。

    不要插入字符串;使用日期文字(它将被转换为时间戳):

    Insert into GTT_A values (DATE '1901-01-01');
    

    如果您想包含时间组件,则为时间戳文字:

    Insert into GTT_A values (TIMESTAMP '1901-01-01 00:00:00');
    

    或者,如果您想使用字符串,则使用带有格式模型的TO_DATE 将字符串显式转换为日期:

    Insert into GTT_A values (
      TO_DATE(
        '01-JAN-1901',
        'DD-MON-YYYY',
        'NLS_DATE_LANGUAGE=AMERICAN'
      )
    );
    

    TO_TIMESTAMP:

    Insert into GTT_A values (
      TO_TIMESTAMP(
        '01-JAN-1901',
        'DD-MON-YYYY',
        'NLS_DATE_LANGUAGE=AMERICAN'
      )
    );
    

    如果您依赖隐式转换,那么 Oracle 将尝试将您的字符串隐式转换为日期和您的查询:

    Insert into GTT_A values ('01-JAN-1901');
    

    有效地转换为:

    Insert into GTT_A values (
      TO_TIMESTAMP(
        '01-JAN-1901',
        ( SELECT value
          FROM   NLS_SESSION_PARAMETERS
          WHERE  parameter = 'NLS_TIMESTAMP_FORMAT' )
      )
    );
    

    每个用户都可以在任何时间设置自己的会话参数,这样您的查询可以运行一分钟,然后用户更新他们的会话参数,您的查询将停止工作,而无需更改您的查询。不要依赖隐式转换;做到这一点,您就不需要使用日期/时间戳文字或使用显式转换来转换任何内容。

    【讨论】:

    • 感谢您的回复。通过转换为日期,我得到了正确的结果
    【解决方案2】:

    检查您的NLS_TIMESTAMP_FORMAT 使用

    SELECT
      value
    FROM
      V$NLS_PARAMETERS
    WHERE
      parameter = 'NLS_TIMESTAMP_FORMAT';
    

    并在插入示例之前使用以下命令将年份更改为四位数

         alter session set nls_timestamp_format='DD-MON-YYYY HH.MI.SSXFF AM'
    

    【讨论】:

    • 谢谢。通过更改格式,即使我将字符串插入日期,我也会得到正确的结果。
    • @AnuraagVeerapaneni - 更改会话 nls_???_format 只是临时措施,在开发中可能还可以;但对于生产来说,这不是正确的方法。永远不要传入字符串并期望 隐式 转换。在函数调用中使用日期和时间戳文字(请参阅文档),或使用 TO_TIMESTAMP() 和类似的,带有显式 nls_timestamp_format(或类似的)
    猜你喜欢
    • 2011-08-10
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多