在 PST 中更新 sysdate/time 的列

Column to update the sysdate/time in PST

我在 IG 中有两列(状态和更新日期)。每次状态列发生变化时,我都想记录它的更新时间(在 PST 中)。这是我的做法,但没有按预期工作。

我在更新日期列上创建了一个动态操作,以便在更改时设置值。但是,我更新的专栏显示了一些不正确的 time/date.

SELECT
  TO_CHAR(NEW_TIME( TO_DATE( CAST(SYSDATE as DATE), 'MM-DD-YYYY HH24:MI:SS' ),  'GMT', 'PST' ), 'MM-DD-YYYY HH24:MI:SS') TIME_IN_PST
FROM
  TRANSITION_TASKS_NEW;

enter image description here

SYSDATE 已经是一个日期,因此您不需要在其上使用 CAST。同样,由于它已经是一个日期,因此您不需要在其上使用 TO_DATE,这可能会导致错误。

所以你的代码可以是:

SELECT TO_CHAR(NEW_TIME(SYSDATE, 'GMT', 'PST' ), 'MM-DD-YYYY HH24:MI:SS')
         AS TIME_IN_PST
FROM   DUAL;

但是,您可以使用 SYSTIMESTAMP(returns 一种 TIMESTAMP 数据类型)使它更简单,然后您不需要使用 NEW_TIME 函数:

SELECT TO_CHAR(SYSTIMESTAMP AT TIME ZONE 'PST', 'MM-DD-YYYY HH24:MI:SS')
         AS TIME_IN_PST
FROM   DUAL;

这两个输出:

TIME_IN_PST
03-03-2022 08:03:27

db<>fiddle here


至于是什么导致你的代码不正确:

TO_DATE 函数将字符串作为第一个参数。当你这样做时:

TO_DATE(SYSDATE, 'MM-DD-YYYY HH24:MI:SS' )

然后 Oracle 会将其隐式转换为:

TO_DATE(
  TO_CHAR(
    SYSDATE,
    ( SELECT value
      FROM   NLS_SESSION_PARAMETERS
      WHERE  parameter = 'NLS_DATE_FORMAT')
  ),
  'MM-DD-YYYY HH24:MI:SS'
)

如果 NLS_DATE_FORMAT 会话参数不是 MM-DD-YYYY HH24:MI:SS(并且 永远不会匹配它)那么您将得到一个错误,或者更糟的是,一个意想不到的可能无效的结果.

例如:

ALTER SESSION SET NLS_DATE_FORMAT = 'MM-DD-RR';

SELECT TO_CHAR(
         NEW_TIME(
           TO_DATE(SYSDATE, 'MM-DD-YYYY HH24:MI:SS' ),
           'GMT',
           'PST'
         ),
         'MM-DD-YYYY HH24:MI:SS'
       ) AS TIME_IN_PST
FROM   DUAL;

输出:

TIME_IN_PST
03-02-0022 16:00:00

时间部分错误 AND 世纪错误!

要解决此问题,请不要对已经 DATE 的值使用 TO_DATE

db<>fiddle here