用于更新 PST 系统日期/时间的列

发布于 2025-01-11 21:46:01 字数 420 浏览 0 评论 0原文

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

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

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;

在此处输入图片说明

I have two columns (Status & Updated Date) in IG. Everytime the status column is change with something, I want to log the time it is updated (in PST). Here is how I'm doing it but its not working as expected.

I have created a dynamic action on my updated date column to set the value when it is changed. However, my updated column shows some incorrect 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

魂ガ小子 2025-01-18 21:46:01

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 (返回 TIMESTAMP 数据类型)使其变得更加简单,然后您不需要使用 >NEW_TIME 函数:

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

两者输出:

<表类=“s-表”>
<标题>

TIME_IN_PST


<正文>

2022 年 3 月 3 日 08:03:27

db<>fiddle 此处


至于导致代码不正确的原因:

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 (且 默认 NLS 日期格式 与此不匹配),那么您将收到错误,或者更糟糕的是,意外且可能无效 结果。

例如:

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;

输出:

<表类=“s-表”>
<标题>

TIME_IN_PST


<正文>

03-02-0022 16:00:00

其中有错误的时间成分错误的世纪!

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

db<>fiddle 此处

SYSDATE is already a date so you do not need to use CAST on it. Similarly, since it is already a date you do not need to use TO_DATE on it and this is likely to cause errors.

So your code can just be:

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

However, you can make it even simpler using SYSTIMESTAMP (which returns a TIMESTAMP data type) and then you do not need to use the NEW_TIME function:

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

Which both output:

TIME_IN_PST
03-03-2022 08:03:27

db<>fiddle here


As for what is causing your code to be incorrect:

The TO_DATE function takes a string as the first argument. When you do:

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

Then Oracle will implicitly convert it to:

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

If the NLS_DATE_FORMAT session parameter is not MM-DD-YYYY HH24:MI:SS (and the default NLS date format never matches that) then you will get either an error or, worse, an unexpected and probably invalid result.

For example:

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;

Outputs:

TIME_IN_PST
03-02-0022 16:00:00

Which has the wrong time component AND the wrong century!

To solve this, do not use TO_DATE on values that are already DATEs.

db<>fiddle here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文