その中にtimestamp
フィールドを持つOracle DBがあります。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ステートメントの実行計画がどのように悪化するかについて、具体的な例を示すことができますか?それができない方法の例を示すことができます。代わりに、私たち全員が避けたいと思うのは、予期された行ソース操作(つまり、最適な操作)の使用を妨げる予期しないデータ型強制です。
種類は、挿入する値がどこから来ているかによって異なります。現在の時刻を挿入する場合は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:タイムゾーン地域が見つかりません
私自身の将来の参考のために:
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);
dbでの変換は必要ありません。Oracleのドキュメントを参照