【问题标题】:How to insert a timestamp in Oracle?如何在 Oracle 中插入时间戳?
【发布时间】:2011-07-22 04:57:36
【问题描述】:

我有一个带有 timestamp 字段的 Oracle 数据库。将timestamp 插入此字段的正确 SQL 代码是什么?

【问题讨论】:

标签: sql oracle


【解决方案1】:
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));

如果要插入当前时间戳,则:

insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);

【讨论】:

  • 为什么是TO_DATE 而不是TO_TIMESTAMP
  • 这个简单的INSERT 语句无关紧要,但通常你不想使用这样的绑定变量。第一条语句中的类型转换防止它对绑定敏感,这限制了 Oracle 创建良好计划的能力。如果您使用 values (:ts_val) 代替,优化器可能会更好地工作,假设 :ts_val 直接映射到时间戳。
  • @JonHeller 你能否举一个具体的例子来说明使用to_timestamp 会如何导致可规划SQL 语句的执行计划错误?我可以举一个例子说明它不会。相反,我认为我们都想要避免的是 unexpected 数据类型强制,它排除了使用预期的行源操作(即最佳操作)。
  • @jeff6times7 请参阅this Gist,了解未转换的绑定变量如何优于已转换的绑定变量。差异可能仅在数据有偏差时才重要。使用本机绑定类型,Oracle 可以更好地理解数据并根据这些值做出更好的估计。
【解决方案2】:
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPSYSTIMESTAMP 是用于此目的的 Oracle 保留字。它们是SYSDATE 的时间戳模拟。

【讨论】:

    【解决方案3】:
    INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
    

    【讨论】:

      【解决方案4】:

      这取决于您要插入的值的来源。如果要插入当前时间,可以使用CURRENT_TIMESTAMP,如其他答案所示(或SYSTIMESTAMP)。

      如果您将时间作为字符串并希望将其转换为时间戳,请使用类似的表达式

      to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')
      

      我希望时间格式组件是不言自明的,除了 FF3 表示 3 位数的亚秒精度。您可以达到 6 位的精度。

      如果您从应用程序插入,最佳答案可能取决于日期/时间值以您的语言存储的方式。例如,您可以将某些 Java 对象直接映射到 TIMESTAMP 列,但您需要了解 JDBC 类型映射。

      【讨论】:

        【解决方案5】:

        我更喜欢 ANSI 时间戳文字:

        insert into the_table 
          (the_timestamp_column)
        values 
          (timestamp '2017-10-12 21:22:23');
        

        手册中的更多详细信息:https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062

        【讨论】:

        • Oracle 11. 字段定义为 TIMESTAMP(6) 不为 NULL。使用timestamp '2019-05-16 10:05:51:19:277401' 我有这个错误:ORA-01882: timezone region not found
        【解决方案6】:

        在sql中插入日期

        insert
        into tablename (timestamp_value)
        values ('dd-mm-yyyy hh-mm-ss AM');
        

        如果我们想插入系统日期

        insert
        into tablename (timestamp_value)
        values (sysdate);
        

        【讨论】:

          【解决方案7】:

          一个人可以简单地使用

          INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
          VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');
          

          这样您就不必担心日期格式字符串,只需使用默认时间戳格式。

          适用于 Oracle 11,不知道它是否适用于早期的 Oracle 版本。

          【讨论】:

            【解决方案8】:

            首先,您需要将字段设为 Nullable,然后再如此简单 - 而不是输入值,而是输入此代码 CURRENT_TIMESTAMP

            【讨论】:

              【解决方案9】:

              供我以后参考:

              使用 cx_Oracle 使用 cursor.setinputsize(...):

              mycursor = connection.cursor();
              
              mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
              params = { 'mytimestamp': timestampVar };
              cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);
              

              无需在数据库中进行转换。见Oracle Documentation

              【讨论】:

                【解决方案10】:
                CREATE TABLE Table1 (
                id int identity(1, 1) NOT NULL,
                Somecolmn varchar (5),
                LastChanged [timestamp] NOT NULL)
                

                这适用于 mssql 2012

                INSERT INTO Table1 VALUES('hello',DEFAULT)  
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2016-08-21
                  • 2017-10-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多