2013-03-14 3 views
0

Я бегу этот SQL на Oracle (Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production):Oracle создать таблицу с виртуальной колонки

CREATE TABLE R_SEQUENCES_COUNT1 
    (
    DS_ID NUMBER, 
    LINE_TIME TIMESTAMP(6), 
    DAY_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME)), 
    HOUR_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME,'HH24')) , 
    MINUTE_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME,'MI')) , 
    SECOND_ID DATE GENERATED ALWAYS AS (LINE_TIME), 
    R_ID  NUMBER, 
    SEQUENCE_ID NUMBER 
)NOLOGGING 
    TABLESPACE TWC_DATA_SPACE 
    PARTITION BY LIST (DS_ID) 
    SUBPARTITION BY LIST(DAY_ID) 
    (PARTITION DS_ID_OTHER VALUES (DEFAULT) 
    (SUBPARTITION DS_ID_OTHER_DAY_ID_OTHER VALUES (DEFAULT))) 

и получить эту ошибку:

Error at Command Line:8 Column:40 
Error report: 
SQL Error: ORA-54016: Invalid column expression was specified 

что не так?

ответ

1

, как вы хотите, как использование дата:

SECOND_ID DATE GENERATED ALWAYS AS (cast(LINE_TIME as date)), 

иначе вы могли бы сделать:

SECOND_ID TIMESTAMP GENERATED ALWAYS AS (LINE_TIME + numtodsinterval(0, 'day')), 

, хотя в этом случае не уверен, почему вы хотите точную копию колонки?

, например, для второго:

SQL> CREATE TABLE R_SEQUENCES_COUNT1 
    2 (
    3  DS_ID NUMBER, 
    4  LINE_TIME TIMESTAMP(6), 
    5  DAY_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME)), 
    6  HOUR_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME,'HH24')) , 
    7  MINUTE_ID DATE GENERATED ALWAYS AS (TRUNC(LINE_TIME,'MI')) , 
    8  SECOND_ID TIMESTAMP GENERATED ALWAYS AS (LINE_TIME+numtodsinterval(0, 'day')), 
    9  R_ID  NUMBER, 
10  SEQUENCE_ID NUMBER 
11 )NOLOGGING 
12/

Table created. 

SQL> insert into R_SEQUENCES_COUNT1 (ds_id, line_time) values (1, systimestamp); 

1 row created. 

SQL> @print_Table "select * from R_SEQUENCES_COUNT1" 
DS_ID       : 1 
LINE_TIME      : 14-mar-2013 09:56:31.104921 
DAY_ID      : 14-mar-2013 00:00:00 
HOUR_ID      : 14-mar-2013 09:00:00 
MINUTE_ID      : 14-mar-2013 09:56:00 
SECOND_ID      : 14-mar-2013 09:56:31.104921 
R_ID       : 
SEQUENCE_ID     : 
----------------- 
+0

литье - проблема, потому что она вокруг даты, и мне нужна дата без раунда. – igreen

+0

@igreen затем используйте второе решение. 'DATE' имеет только второе разрешение. так что вы хотите получить точную копию атрибута 'line_time'? – DazzaL

+0

в second_id Я хочу удалить миллисекунды. – igreen

0

В вашем создании

//set condition is invalid 
SECOND_ID DATE GENERATED ALWAYS AS (LINE_TIME) 



// change to this... 
SECOND_ID DATE GENERATED ALWAYS AS (TIMESTAMP) 

Тип данных TIMESTAMP позволяет за доли секунды. Если вы преобразуете его в ДАТУ, дробные секунды будут удалены - например,

SO в выборе СЕКУНД ..

select cast(systimestamp as date) from dual; 

Другой способ я думаю, что это ...

является TRUNC() отметка времени в секундах вы можете привести его к дате

CAST(timestamp AS DATE) 

затем выполните TRUNC как:

TRUNC(CAST(timestamp AS DATE), 'YEAR') 
+0

, но я хочу, чтобы second_id был таким же, как колонка line_time, без доли секунды, так как это происходит? и, как я комментирую, перед тем, как сделать это не хорошо, потому что он округляет дату. – igreen

+0

добавлен еще один способ, но еще не проверен. Надеюсь, он сработает ... –

Смежные вопросы