1

次のクエリは成功します。

SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;

以下は失敗します:

SELECT INTERVAL time_field HOUR TO SECOND(6) -- time_field is a VARCHAR2(15)
FROM some_table;

次のエラーがあります:

ORA-00923: FROM keyword not found where expected

2番目のクエリを修正してHOURTOSECOND INTERVALをプルバックするにはどうすればよいですか?

私が試してみると:

SELECT cast(time_field AS INTERVAL HOUR TO SECOND(6))
FROM some_table

私は次のようになります:

ORA-00963: unsupported interval type

テスト設定:

CREATE TABLE some_table (
   time_field VARCHAR2(50)
);

INSERT ALL
INTO some_table (time_field) VALUES ('10:00:00.000000')
INTO some_table (time_field) VALUES ('12:00:00.000000')
INTO some_table (time_field) VALUES ('15:00:00.000000')
INTO some_table (time_field) VALUES ('17:00:00.000000')
INTO some_table (time_field) VALUES ('20:00:00.000000')
INTO some_table (time_field) VALUES (NULL)
SELECT * FROM DUAL;
4

2 に答える 2

0

この(テストされていない)キャストが求められたと思います。

SELECT cast (time_field as interval hour to second(6))
FROM some_table;

列は、間隔へのキャストと互換性のあるタイプである必要があり、間隔として解釈できるデータが含まれている必要があります。

CAST用のOracle11gドキュメント


サンプルコード

create table test (
  interval_type interval day to second,
  varchar_type varchar2(35) 
);

insert into test values (
  (current_timestamp - to_date(current_date)),
  (current_timestamp - to_date(current_date))
);

select 
  interval_type, 
  varchar_type
from test;

INTERVAL_TYPE                                                                              VARCHAR_TYPE
{"Bytes":[-128,0,0,0,78,95,84,-102,-92,-83,-64],"ShareBytes":null,"Length":11,"Stream":{}} +000000000 18:35:24.000000

select 
  interval_type, 
  cast (varchar_type as interval day to second)
from test;

INTERVAL_TYPE                                                                               CAST(VARCHAR_TYPEASINTERVALDAYTOSECOND)
{"Bytes":[-128,0,0,0,78,95,84,-102,-92,-83,-64],"ShareBytes":null,"Length":11,"Stream":{}}  {"Bytes":[-128,0,0,0,78,95,84,-128,0,0,0],"ShareBytes":null,"Length":11,"Stream":{}}
于 2012-09-11T20:00:09.807 に答える
0

TO_DSINTERVAL関数を使用できます; ここでは、CTEを使用してテーブルを複製する例を示します。

WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
SELECT TO_DSINTERVAL('0 ' || time_field)
FROM some_table;

TO_DSINTERVAL('0'||TIME_FIELD)
---------------------------------------------------------------------------
+000000000 00:00:00.000000000

関数が認識できる形式にするには、「日」の部分を指定する必要があるため、ダミー'0 '文字列が先頭に追加されることに注意してください。

固定値クエリは、わずかに異なる形式を返します(または、少なくともわずかに異なって表示されます。intervaldaaタイプには、日付とまったく同じ形式モデルがないため、正確に表現する方法がわかりません)。

SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;

INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000

これを複製するには、次のことcastが必要な場合にこれを行うことができます。

WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
SELECT CAST(TO_DSINTERVAL('0 ' || time_field) AS INTERVAL DAY TO SECOND(6))
FROM some_table;

CAST(TO_DSINTERVAL('0'||TIME_FIELD)ASINTERVALDAYTOSECOND(6))
---------------------------------------------------------------------------
+00 00:00:00.000000

... あるいは単に:

WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
SELECT CAST('0 ' || time_field AS INTERVAL DAY TO SECOND(6))
FROM some_table;

CAST('0'||TIME_FIELDASINTERVALDAYTOSECOND(6))
---------------------------------------------------------------------------
+00 00:00:00.000000

...これは@catcallが最初に提案したものとほぼ同じですが、これにも'0 '先頭に追加する必要があります。そうしないと、が表示されますORA-01867。(または、を使用しようとするHOUR TO SECONDORA-00963、追加された日の値でも)。しかし、私はそれが暗黙的または同様のことをしていると推測します(そしてそれはほんの少しの教育を受けていますが)TO_DSINTERVAL、そして私は明示的なものを使用したいと思うので、何が起こっているのか確信していました。それは私だけかもしれませんが...


サンプルデータを使用すると、私も取得しますORA-01867が、これはnull値が原因です。を使用しcaseて、結果でそれをnullのままにすることができます。

SELECT CASE WHEN time_field IS NULL THEN null
    ELSE CAST('0 ' || time_field AS INTERVAL DAY TO SECOND(6)) END
FROM some_table;

CASEWHENTIME_FIELDISNULLTHENNULLELSECAST('0'||TIME_FIELDASINTERVALDAYTOSECO
---------------------------------------------------------------------------
+00 10:00:00.000000
+00 12:00:00.000000
+00 15:00:00.000000
+00 17:00:00.000000
+00 20:00:00.000000


6 rows selected.
于 2012-09-11T22:33:35.793 に答える