Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle虚拟列、日期和时间戳_Oracle_Date_Timestamp_Virtual Column - Fatal编程技术网

Oracle虚拟列、日期和时间戳

Oracle虚拟列、日期和时间戳,oracle,date,timestamp,virtual-column,Oracle,Date,Timestamp,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

我在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:
获取数据的问题在哪里?我尝试了很多格式掩码,但没有任何帮助

DATETIME_1 DATE

TO_CHAR(DATETIME_1, 'FF9')
这就是问题所在-日期没有小数秒

将char强制转换为timestamp是危险的(结果取决于nls设置)

我想你想要这个:

CREATE TABLE TBDATETIME(DATETIME_1 DATE, DATETIME_2 TIMESTAMP(9) GENERATED ALWAYS AS (CAST(DATETIME_1 AS TIMESTAMP(9))) VIRTUAL);
这就是问题所在-日期没有小数秒

将char强制转换为timestamp是危险的(结果取决于nls设置)

我想你想要这个:

CREATE TABLE TBDATETIME(DATETIME_1 DATE, DATETIME_2 TIMESTAMP(9) GENERATED ALWAYS AS (CAST(DATETIME_1 AS TIMESTAMP(9))) VIRTUAL);


为什么要将日期强制转换为字符,然后再转换回时间戳?我想从systimestamp生成毫秒,然后将它们“连接”到虚拟列中的日期。。。我知道这是一个糟糕的解决方案,但我不能更改列类型,也不能向表中添加时间戳列。在虚拟列定义中不能使用诸如SYSTIMESTAMP之类的非确定性函数(根据环境、时间等返回不同值的函数-使用相同参数的不同调用会产生不同的结果)您真的只需要一个默认为
systimestamp
的普通列吗?如果您总是将
datetime_1
设置为
sysdate
,则会产生相同的效果;如果你将它设置为其他日期,那么无论如何你都必须将分数秒设置为零,因为其他任何事情都没有意义。您实际要解决的问题是什么?如果我执行像这样的插入,插入TBDATETIME(DATETIME_1)值(SYSDATE);我希望得到以下结果:从TBDATETIME中选择*;DATETIME_1 DATETIME_2 10/23/2014 16:27:14 10/23/2014 16:27:14.1234567,其中DATETIME_2是虚拟列。简单来说,我想要一个datetime+毫秒的列。为什么要将日期强制转换为字符,然后再转换回时间戳?我希望从systimestamp生成毫秒,然后将它们“连接”到虚拟列中的日期。。。我知道这是一个糟糕的解决方案,但我不能更改列类型,也不能向表中添加时间戳列。在虚拟列定义中不能使用诸如SYSTIMESTAMP之类的非确定性函数(根据环境、时间等返回不同值的函数-使用相同参数的不同调用会产生不同的结果)您真的只需要一个默认为
systimestamp
的普通列吗?如果您总是将
datetime_1
设置为
sysdate
,则会产生相同的效果;如果你将它设置为其他日期,那么无论如何你都必须将分数秒设置为零,因为其他任何事情都没有意义。您实际要解决的问题是什么?如果我执行像这样的插入,插入TBDATETIME(DATETIME_1)值(SYSDATE);我希望得到以下结果:从TBDATETIME中选择*;DATETIME_1 DATETIME_2 10/23/2014 16:27:14 10/23/2014 16:27:14.1234567,其中DATETIME_2是虚拟列。简单地说,我想要一个datetime+毫秒的列。非常感谢多同步!是的,您的解决方案进行得很顺利,但有一个问题:将datetime_2转换为timestamp将始终生成000000000毫秒。你有解决这个问题的办法吗?提前谢谢。Igor@Igor您想将日期强制转换为时间戳。日期没有毫秒。所以在这种情况下不可能得到毫秒,再次感谢Multisync;你是对的:从日期类型中检索毫秒是不可能的;但问题是:例如,我可以这样做吗:创建表TBDATETIME(DATETIME_1 DATE,DATETIME_2 TIMESTAMP(9)始终生成为(CAST(TO_CHAR(DATETIME_1,'DD/MM/YYYY HH24:MI:SS')||'。| TO_CHAR(SYSTIMESTAMP,'FF9')作为时间戳(9))虚拟);但是使用TO_CHAR(SYSTIMESTAMP,'FF9')会引发错误:ORA-54002只能在虚拟列表达式中指定纯函数,Igor@Igor我回答了主要问题。你想实现什么?非常感谢Multisync!是的,您的解决方案进行得很顺利,但有一个问题:将datetime_2转换为timestamp将始终生成000000000毫秒。你有解决这个问题的办法吗?提前谢谢。Igor@Igor您想将日期强制转换为时间戳。日期没有毫秒。所以在这种情况下不可能得到毫秒,再次感谢Multisync;你是对的:从日期类型中检索毫秒是不可能的;但问题是:例如,我可以这样做吗:创建表TBDATETIME(DATETIME_1 DATE,DATETIME_2 TIMESTAMP(9)始终生成为(CAST(TO_CHAR(DATETIME_1,'DD/MM/YYYY HH24:MI:SS')||'。| TO_CHAR(SYSTIMESTAMP,'FF9')作为时间戳(9))虚拟);但是使用TO_CHAR(SYSTIMESTAMP,'FF9')会引发错误:ORA-54002只能在虚拟列表达式中指定纯函数,Igor@Igor我回答了主要问题。你想要实现什么?