0

列 date_time 型 (varchar2 (40) ) のテーブルを作成しましたが、現在のシステムの日付と時刻を挿入しようとすると、エラーが発生します (値が多すぎます)。挿入文の何が問題なのか教えてください。

create table HR (type varchar2 (20), raised_by number (6), complaint varchar2 (500), date_time varchar2(40))


insert into HR values ('request',6785,'good morning',sysdate,'YYYY/MM/DD:HH:MI:SSAM')
4

3 に答える 3

3

エラーの直接の原因は、メッセージが示すように、値が多すぎることです。つまり、values列よりも多くの要素が句に含まれています。将来の問題や混乱を避けるために、列名を明示的にリストすることをお勧めします。実際にこれを行っています。

insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',sysdate,'YYYY/MM/DD:HH:MI:SSAM')

... sp 4 つの列がありますが、5 つの値があります。現在の日付/時刻を文字列として挿入しようとしているため、次のto_char()関数を使用する必要があります。

insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',
  to_char(sysdate,'YYYY/MM/DD:HH:MI:SSAM'))

ただし、日付 (または数値などのその他の構造化データ) を文字列として保存することはお勧めできません。ドキュメントのメモとして:

Oracle Databaseによって操作される各値には、データ型があります。値のデータ型は、プロパティの固定セットを値に関連付けます。これらのプロパティにより、Oracle はあるデータ型の値を別のデータ型の値とは異なる方法で処理します。たとえば、NUMBER データ型の値は追加できますが、RAW データ型の値は追加できません。

文字列を使用すると、無効な値を入れることができます。適切なDATEデータ型を使用すると、誤って無効な値や紛らわしい値を入れることはできません。Oracle は列の使用を最適化することもできます。安全かつ効率的に値を比較します。使用している形式はいくつかよりも優れていますが、文字列比較を使用しても、2 つの値を比較してどちらが古いかを簡単に比較することはできないためdate_time、たとえば、列で適切に並べ替えることができません。

2013/11/15:09:00:00AM値を含む2 つの行を挿入したとします2013/11/15:08:00:00PM。どちらが先ですか? AM/PM マーカーを見て、最初のマーカーが早いことを認識する必要があります。8文字列比較では、 の前にソートされるため、間違ってしまいます9HH24代わりに使用してHHそれをAM回避しますが、それでも真の日付よりも効率的ではありません。

時刻コンポーネントを含む日付を保存する必要がある場合は、秒までの精度を持つDATEdata typeを使用できます。または、小数秒も必要な場合は、を使用できますTIMESTAMP。次に、テーブルと挿入は次のようになります。

create table HR (type varchar2 (20), raised_by number (6),
  complaint varchar2 (500), date_time date);

insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',sysdate);

クエリの一部として、表示目的で必要な形式で値を取得できます。

select type, raised_by, complaint,
  to_char(date_time, 'YYYY/MM/DD:HH:MI:SSAM') as date_time
from HR
order by date_time;

TYPE                  RAISED_BY COMPLAINT            DATE_TIME           
-------------------- ---------- -------------------- ---------------------
request                    6785 good morning         2013/11/15:08:44:35AM 

日付のみを表示用の文字列として扱います。

于 2013-11-15T08:46:36.400 に答える
0

TO_DATE()またはTO_TIMESTAMPまたは To_char()関数を使用できます。

HR 値に挿入 ('request',6785,'good morning',TO_DATE(sysdate, 'yyyy/mm/dd hh24:mi:ss'))

HR 値に挿入 ('request',6785,'good morning',TO_TIMESTAMP(systimestamp, 'yyyy/mm/dd hh24:mi:ss'))

sysdate - 日付と時刻が表示されます。

systimestamp - ミリ秒単位で datetime を返します。

To_date() - 文字列を日付に変換するために使用されます。To_char() - 日付を文字列に変換するために使用されます。

おそらくここでは To_char() を使用する必要があります。これは、テーブル定義の date_time 列に varchar 型があるためです。

于 2013-11-15T07:42:04.573 に答える
-1

TIMESTAMPのデータ型を使用しdate_timeます。挿入中は現在のタイムスタンプを使用します。

create table HR (type varchar2(20), raised_by number(6), complaint varchar2(500), date_time timestamp);


insert into HR values ('request',6785,'good morning', systimestamp);

その他のオプション: http://psoug.org/reference/timestamp.html

于 2013-11-15T07:44:27.687 に答える