【问题标题】:TIMESTAMP(6) Oracle InsertTIMESTAMP(6) Oracle 插入
【发布时间】:2012-04-03 01:49:03
【问题描述】:

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

谁能给我一个例子来说明这个值的样子?

我也希望能够插入日期

03/18/2012 02:35 AM

看起来像

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

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

编辑----

我怎样才能摆脱时间戳列大量空间

【问题讨论】:

  • 我正在使用TIMESTAMP(0),但不知何故,dept_time 列有很大的空间,见上图,我怎样才能摆脱这个?
  • 您的编辑提出了不同的问题。 SO 旨在为重点问题提供离散的答案。如果您有新问题,请提出新问题。提问是免费的,而且你更有可能得到答案(尽管我注意到贾斯汀在他的回复中实际上已经回答了你的第二个问题)。
  • 好吧,记住了,但是这两个有点相关,我没有看到提出新问题的意义,感谢贾斯汀他是王牌;)

标签: oracle oracle11g relational-database database-schema


【解决方案1】:

无论何时处理DATETIMESTAMP 数据类型,都应始终插入DATETIMESTAMP 值。您不应插入字符串并依赖隐式转换将字符串转换为DATETIMESTAMP。您应该明确调用TO_DATETO_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 显示的列)。

【讨论】:

  • 再次感谢贾斯汀,所以时间戳和日期几乎相同?
  • @JoseDavidGarciaLlanos - DATE 将时间存储到秒。 TIMESTAMP 最多可以存储 9 位小数秒。您还可以声明一个 TIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE 来存储时区,以便您可以将时间从一个时区转换为另一个时区。
  • 啊,好的,谢谢,我为那些使用时间戳的列获得了大量未使用的空间,您可以在上图中看到它。这是可以修复的还是应该是这样的。谢谢贾斯汀
  • @JoseDavidGarciaLlanos - 您似乎在谈论格式化,而不是数据库中未使用的空间。您可以调整 SQL*Plus 显示数据的方式,我通过这样做的示例更新了我的答案。
【解决方案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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    相关资源
    最近更新 更多