时间戳(6位)Oracle插入

3

我正在为一个数据库生成虚拟数据,其中一个属性使用了 TIMESTAMP(6)

有人能给我一个值的例子吗?

另外,我想要能够插入日期和时间。

例如:2012年03月18日 02:35 上午

这样看起来更加清晰。

INSERT INTO FLIGHT VALUES (1,'London Heathrow','Miami Airport','03/18/2012 02:35 AM','04/18/2012 13:35 PM');

这个可能吗?非常感谢...

编辑----

如何消除时间戳列的大量空间

space


我正在使用 TIMESTAMP(0),但是一些dept_time列却有巨大的空格,如上图所示,我该如何去掉它? - David Garcia
2
您的编辑提出了一个不同的问题。SO旨在为专注的问题提供离散的答案。如果您有新问题,请提出新的问题。提问是没有费用的,而且您更有可能得到答案(尽管我注意到Justin实际上已经在他的回答中回答了您的第二个问题)。 - APC
好的,我会记住的。不过这两个问题有点相关,我没看到开新问题的意义。感谢Justin,他是个高手;) - David Garcia
2个回答

11
无论何时你处理的是 DATE 或者 TIMESTAMP 数据类型,都应该插入 DATE 或者 TIMESTAMP 值。不应该插入字符串并依赖隐式转换将字符串转换为 DATE 或者 TIMESTAMP。而应该显式地调用 TO_DATE 或者 TO_TIMESTAMP。在你的 INSERT 语句中,也应该显式列出你要插入的列的名称。
你希望你的 INSERT 语句看起来像这样:
INSERT INTO FLIGHT( <<list of columns>> )
  VALUES (1,
         'London Heathrow',
         'Miami Airport',
         to_timestamp( '03/18/2012 02:35 AM', 'MM/DD/YYYY HH:MI AM'),
         to_timestamp( '04/18/2012 13:35 PM', 'MM/DD/YYYY HH:MI AM') );

您可以通过更改格式掩码来调整SQL * Plus在特定列中显示数据的方式。例如:

SQL> column dept_time format a30;
SQL> column arrv_time format a30;

这会导致SQL*Plus在30个水平字符中显示DEPT_TIMEARRV_TIME(您当前的NLS_TIMESTAMP_FORMAT似乎生成28个字符的字符串,如果您更改NLS_TIMESTAMP_FORMAT,可能需要更改您要求SQL*Plus显示的列的宽度)。


再次感谢您,Justin。时间戳和日期几乎是相同的吗? - David Garcia
@JoseDavidGarciaLlanos - DATE 存储到秒的时间。TIMESTAMP 可以存储高达 9 位小数的分数秒。您还可以声明一个带有时区的 TIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE,以便您可以将时间从一个时区转换为另一个时区。 - Justin Cave
啊,好的,谢谢。我使用时间戳来获取这些列的大量未使用空间,你可以在上面的图片中看到。这个问题能够解决吗,还是这就是它应该有的样子?谢谢,Justin。 - David Garcia
@JoseDavidGarciaLlanos - 看起来你在谈论格式,而不是数据库中未使用的空间。你可以调整SQL*Plus显示数据的方式,我已经更新了我的答案,并提供了一个示例。 - Justin Cave

2
请看下面的示例:
ALTER SESSION SET nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';

SELECT *
FROM orders 
WHERE ordered_at 
   BETWEEN '2013-10-06 12:00:00' 
       AND '2013-10-06 16:00:00'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接