在 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
我在 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