Oracle虚拟列、日期和时间戳

use*_*er1 0 oracle timestamp date virtual-column

我在 Oracle 中遇到虚拟列问题(我需要从日期列开始的时间戳);这是我的例子:

CREATE TABLE TBDATETIME(
  DATETIME_1 DATE,
  DATETIME_2 TIMESTAMP(9) GENERATED ALWAYS AS (
    CAST( TO_CHAR(DATETIME_1, 'DD/MM/YYYY HH24:MI:SS')
      || '.' || TO_CHAR(DATETIME_1, 'FF9')  AS TIMESTAMP(9))
   ) VIRTUAL
 );

INSERT INTO TBDATETIME(DATETIME_1)
VALUES(SYSDATE);

COMMIT;

SELECT *
FROM TBDATETIME;

ORA-01821: date format not recognized
01821. 00000 -  "date format not recognized"
*Cause:    
*Action:
Run Code Online (Sandbox Code Playgroud)

获取数据的问题出在哪里?我尝试了很多格式掩码,但没有任何帮助......

Mul*_*ync 5

DATETIME_1 DATE

TO_CHAR(DATETIME_1, 'FF9')
Run Code Online (Sandbox Code Playgroud)

这就是问题所在 - DATE 没有小数秒

将 char 转换为时间戳是危险的(结果取决于 nls 设置)

我想你想要这个:

CREATE TABLE TBDATETIME(DATETIME_1 DATE, DATETIME_2 TIMESTAMP(9) GENERATED ALWAYS AS (CAST(DATETIME_1 AS TIMESTAMP(9))) VIRTUAL);
Run Code Online (Sandbox Code Playgroud)

  • @Igor你想将 DATE 转换为 TIMESTAMP 。DATE 没有毫秒。所以在这种情况下不可能得到毫秒 (2认同)