【问题标题】:Issue in removing time stamp in PL/SQL在 PL/SQL 中删除时间戳的问题
【发布时间】:2015-01-20 15:15:46
【问题描述】:

我想将 12/8/2006 12:30:00 转换为 12/8/2006

我试过了-

1. trunc(TO_DATE (effective_date_time,'DD/MM/YYYY HH24:Mi:SS'))
2. TO_DATE (effective_date_time,'DD/MM/YYYY')

但所有这些都返回值为 12/8/0006。

为什么 Oracle 返回 0006 年而不是 2006。

【问题讨论】:

  • effective_date_time的数据类型是什么?
  • 我无法观察到这种行为:sqlfiddle.com/#!4/e837b/1你能详细说明一下吗?
  • 有效日期时间的日期类型只有日期,我已经添加了屏幕截图
  • 您不会将带时间的日期转换为仅日期 - 因为 DATE 也始终包含时间。即使你没有看到它。您的函数调用告诉数据库格式化值,以便您看不到时间片。如果您不想要 12:30:00,可以将值更新为 12/8/2006 00:00:00。

标签: sql oracle date plsql timestamp


【解决方案1】:

如果effective_date_timedate 列,使用to_date() 是完全没用的。

它将首先(隐式!)将date 转换为varchar(基于NLS 设置,只是为了再次将其转换回date

如果您想要日期列的特定格式,请使用 to_char()

to_char(effective_date_time,'DD/MM/YYYY HH24:Mi:SS')

切勿在datetimestamp 列上使用to_date()

【讨论】:

    【解决方案2】:

    试试这个:

    trunc(effective_date_time)
    

    这是一个日期,你不需要 TO_DATE

    当您在 DATE 列上使用 TO_DATE(effective_date_time, 'format') 时,effective_date_time 会使用 NLS 参数转换为 char。我想您的 NLS 设置类似于“dd/mm/yy”。这就是为什么你会得到错误的年份。

    一个简单的例子:

    alter session set nls_date_format = 'dd/mm/yy';
    select trunc(TO_DATE (sysdate,'DD/MM/YYYY HH24:Mi:SS')) from dual;
    
    November, 22 0014 00:00:00+0000
    
    
    alter session set nls_date_format = 'dd/mm/yyyy';
    select trunc(TO_DATE (sysdate,'DD/MM/YYYY HH24:Mi:SS')) from dual;
    
    November, 22 2014 00:00:00+0000
    

    【讨论】:

      【解决方案3】:

      您的NLS_DATE_FORMAT 在年份中的年份为'YY'。然后您在to_date 中再次指定YYYY 的格式,所以2006,首先解释为06,最后又作为@987654326 @。

      真诚的建议,不要在约会时使用To_DATE()。只需TRUNC(yourdate) 即可。

      【讨论】:

      • 我可以更改 NLS_DATE_Format 吗?
      • 是的.. ALTER SESSION 是您所需要的.. 但它是特定于会话的。当您在不同的环境中运行查询时。不保证返回相同的结果
      【解决方案4】:

      试试这个:

      截断(有效日期时间) Trunc 会直接从日期格式中去掉时间戳

      【讨论】:

        猜你喜欢
        • 2020-08-18
        • 1970-01-01
        • 2021-11-16
        • 2017-08-13
        • 1970-01-01
        • 2020-11-03
        • 2013-06-24
        • 1970-01-01
        • 2017-11-05
        相关资源
        最近更新 更多