【发布时间】:2011-07-22 04:57:36
【问题描述】:
我有一个带有 timestamp 字段的 Oracle 数据库。将timestamp 插入此字段的正确 SQL 代码是什么?
【问题讨论】:
-
“我在任何地方都找不到此信息。” Oracle 文档是全面的在线文档。在这里找到它:download.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm
我有一个带有 timestamp 字段的 Oracle 数据库。将timestamp 插入此字段的正确 SQL 代码是什么?
【问题讨论】:
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 直接映射到时间戳。
to_timestamp 会如何导致可规划SQL 语句的执行计划错误?我可以举一个例子说明它不会。相反,我认为我们都想要避免的是 unexpected 数据类型强制,它排除了使用预期的行源操作(即最佳操作)。
INSERT
INTO mytable (timestamp_field)
VALUES (CURRENT_TIMESTAMP)
CURRENT_TIMESTAMP 和 SYSTIMESTAMP 是用于此目的的 Oracle 保留字。它们是SYSDATE 的时间戳模拟。
【讨论】:
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
【讨论】:
这取决于您要插入的值的来源。如果要插入当前时间,可以使用CURRENT_TIMESTAMP,如其他答案所示(或SYSTIMESTAMP)。
如果您将时间作为字符串并希望将其转换为时间戳,请使用类似的表达式
to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')
我希望时间格式组件是不言自明的,除了 FF3 表示 3 位数的亚秒精度。您可以达到 6 位的精度。
如果您从应用程序插入,最佳答案可能取决于日期/时间值以您的语言存储的方式。例如,您可以将某些 Java 对象直接映射到 TIMESTAMP 列,但您需要了解 JDBC 类型映射。
【讨论】:
我更喜欢 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
【讨论】:
timestamp '2019-05-16 10:05:51:19:277401' 我有这个错误:ORA-01882: timezone region not found
在sql中插入日期
insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');
如果我们想插入系统日期
insert
into tablename (timestamp_value)
values (sysdate);
【讨论】:
一个人可以简单地使用
INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');
这样您就不必担心日期格式字符串,只需使用默认时间戳格式。
适用于 Oracle 11,不知道它是否适用于早期的 Oracle 版本。
【讨论】:
首先,您需要将字段设为 Nullable,然后再如此简单 - 而不是输入值,而是输入此代码 CURRENT_TIMESTAMP。
【讨论】:
供我以后参考:
使用 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
【讨论】:
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)
【讨论】: