创建包含日期和时间的表时,数据类型无效?

时间:2018-02-27 17:38:13

标签: sql oracle

在SQL中创建下表时遇到问题:

CREATE TABLE observacion (
carretera VARCHAR2(6), 
sentido VARCHAR2(3),
km NUMBER(3,0),
fecha DATE,
hora TIME,
matricula VARCHAR2(7) NOT NULL,
vin VARCHAR2(17) NOT NULL,
velocidad NUMBER(3,0) NOT NULL,
CONSTRAINT PK_observacion PRIMARY KEY (carretera, sentido, km, fecha, hora),
CONSTRAINT FK_radar FOREIGN KEY (carretera, sentido, km) REFERENCES radar (carretera, sentido, km),
CONSTRAINT FK_vehiculo FOREIGN KEY (matricula, vin) REFERENCES vehiculo (matricula, vin) ON DELETE CASCADE);

我得到的错误是:

   ORA-00902: invalid datatype
00902. 00000 -  "invalid datatype"
*Cause:    
*Action:

我需要fecha和hora有DATE和TIME数据类型,但我认为这就是问题所在。有人可以帮帮我吗?谢谢:))

修改

这是我需要从一个数据库导入到另一个数据库的传入数据:

INSERT INTO megatable VALUES ('6205AIA', 'OQI29527Q44741473', 'Seta', 'Champi', '2200', 'verde', '2005-11-02', '2010-06-26', 'Leila', 'Conza', 'Sanchez', 'Calle de los Tulipanes, N 126, 27306', 'Hayedo de las Caballerizas', NULL, NULL, '1980-04-24', '51464893R', 'Gabriel Enrique', 'Orejuela', 'Herbada', 'Calle Orfebres, N 51, 23734', 'Sotolemures de los Buhos', '555298803', 'G.E.O.H.@servcorreo.uctreseme.edu', '1962-11-09', '69049869M', 'C', '1998-04-07', 49, 'A1', 120, 242, 'ASC', 100, **'2010-04-11', '22:45:38.75'**, 94);

所有这些数据都是VARCHAR2(50)类型

正如你所看到的,这里只有一种关系,而我想要做的就是将所有这些属性分离到不同的关系中,所以一切看起来都更好。这仍然是我想要分别存储日期和时间的内容,但我不认为保持VARCHAR数据类型是最佳选择。

2 个答案:

答案 0 :(得分:3)

OP在EDIT中显示原始问题输入数据的样子。所有值都是字符串;日期和时间组件,显示为输入的第三个和第二个值,来自'2010-04-11''22:45:38.75'

由于时间有小数秒,因此Oracle中最佳数据类型为TIMESTAMP。要从这两个字符串中获取单个时间戳:

TO_TIMESTAMP(str1 || ' ' || str2, 'yyyy-mm-dd hh24:mi:ss.ff')

其中str1str2是任意名称,我只是为进入的两个字符串做了补充;应修改代码以引用这些字符串,无论以何种方式导入数据。

要创建DATE数据类型,一个选项是从时间组件中选择子字符串。我更喜欢另一种选择:首先创建时间戳,如上所示;然后将它全部包装在cast ( ...... as date)

CAST (TO_TIMESTAMP(str1 || ' ' || str2, 'yyyy-mm-dd hh24:mi:ss.ff') AS DATE)

答案 1 :(得分:1)

您可以尝试以下声明。

CREATE TABLE observacion (
carretera VARCHAR2(6), 
sentido VARCHAR2(3),
km NUMBER(3,0),
fecha DATE,
hora interval day (0) to second(0),
matricula VARCHAR2(7) NOT NULL,
vin VARCHAR2(17) NOT NULL,
velocidad NUMBER(3,0) NOT NULL,
CONSTRAINT PK_observacion PRIMARY KEY (carretera, sentido, km, fecha, hora),
CONSTRAINT FK_radar FOREIGN KEY (carretera, sentido, km) REFERENCES radar 
(carretera, sentido, km),
CONSTRAINT FK_vehiculo FOREIGN KEY (matricula, vin) REFERENCES vehiculo 
(matricula, vin) ON DELETE CASCADE);

您只能插入时间的方式是:

insert into observacion (...) values (TO_DSINTERVAL('0 15:00:14'));
希望我能帮助你。 塔拉特