2017-11-15 1 views
0

number(8)データ型書式を持つ表にFILLD_DTという列があります。この列を使用して、自分のテーブルにDerived dateという新しい列を作成しようとしています。
例:塗りつぶされた日には、=以下は数値形式の日付列にoracleの部分文字列関数を使用する方法

20170107は、私が使用しているクエリであり、私は

ORA-00932を取得しています:一貫性のないデータ型を:期待CHARは

(CASE WHEN PERD = 'Beginning' AND SUBSTR(FILLD_DT,5,2) IN (01,02,03) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20170101' 
     WHEN PERD = 'Beginning' AND SUBSTR(FILLD_DT,5,2) IN (04,05,06) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20170501' 
     WHEN PERD = 'Beginning' AND SUBSTR(FILLD_DT,5,2) IN (07,08,09) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20170701' 
     WHEN PERD = 'Beginning' AND SUBSTR(FILLD_DT,5,2) IN (10,11,12) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20171001' 
ELSE FILLD_DT 
END) AS DRVD_DATE 

NUMBER

をしてくださいました私に理解を助ける

以下は完全なクエリです

SELECT DISTINCT 
SRC_ID, 
SEQ_NBR, 
PROD_ID, 
TYPE_CD, 
FILLD_DT, 
PRCSD_DT, 
(CASE WHEN PERD = 'Beginning' AND SUBSTR(FILLD_DT,5,2) IN (01,02,03) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20170101' 
WHEN PERD = 'Beginning' AND SUBSTR(FILLD_DT,5,2) IN (04,05,06) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20170401' 
WHEN PERD = 'Beginning' AND SUBSTR(FILLD_DT,5,2) IN (07,08,09) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20170701' 
WHEN PERD = 'Beginning' AND SUBSTR(FILLD_DT,5,2) IN (10,11,12) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20171001' 
WHEN PERD = 'middle' AND SUBSTR(FILLD_DT,5,2) IN (01,02,03) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20170115' 
WHEN PERD = 'middle' AND SUBSTR(FILLD_DT,5,2) IN (04,05,06) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20170415' 
WHEN PERD = 'middle' AND SUBSTR(FILLD_DT,5,2) IN (07,08,09) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20170715' 
WHEN PERD = 'middle' AND SUBSTR(FILLD_DT,5,2) IN (10,11,12) AND SUBSTR(FILLD_DT,1,4) = 2017 THEN '20171015' 
ELSE FILLD_DT 
END) 
FROM 
SOURCE 

と私はあなたの提案にクエリを変更し、私は以下のエラー

[エラー]実行取得しています(8:29):ORA-01830:日付書式画像が入力全体を変換する前に を終了文字列

SELECT DISTINCT 
SRC_ID, 
SEQ_NBR, 
PROD_ID, 
TYPE_CD, 
FILLD_DT, 
PRCSD_DT, 
(trunc(to_date(FILLD_DT || '01', 'yyyymmdd'), 'Q') 
) AS DRVD_DATE 
FROM 
SOURCE 
WHERE 
SRC_ID = 163662 
+0

私はついていきます 正しい書式設定。 – NEWBEE

答えて

0

はDATEに変換する前の文字に、日付を表す数を、変換します。

DECLARE FILLD_DT NUMBER(0008):= 20170107; DRVD_DATE DATE; BEGIN DBMS_OUTPUT.ENABLE(1000); DRVD_DATE:= TO_DATE ( TO_CHAR(FILLD_DT) 、 'YYYYMMDD' ); DBMS_OUTPUT.PUT_LINE( '派生日付:' || TO_CHAR(DRVD_DATE、 'yyyy-mm-dd')); END; "FILLD_DT || '01'"で何をしようとしているのか理解していません。あなたのDATE形式の文字列 'YYYYMMDD'と一致しない文字列 '2017010701'が得られます。

+0

コードスニペットが正しくフォーマットされていないようです。 – Stilgar

+0

私の結果は、四半期の初めとその四半期の途中にその特定の四半期に割り当てる必要があります。たとえば、私の記入日が20170326でPRDが「開始」であれば、記入日が20170326でPRDが「中」の場合同様に20170101を割り当てなければなりません。次に、第1四半期の日付と月が落ちてから20170105を割り当てなければなりません。 YYYYMMDDの日付も同様ですが、データ型はNumber(8)です。 – NEWBEE

+0

私は参照してください。元の質問は、日付を表す数値をDATEデータ型を持つ変数の値に変換する方法でした。私はそれが答えられていると信じています。 – Stilgar

0

私はあなたがoracle 10gまたはgratterを使用していると仮定し、FILLD_DTのフォーマットは "YYYYMMDD"です。

のOracle 11gのこの作品は:FILLD_DTにおける単一の値が与えられたフォーマットと一致しない場合

SELECT TO_DATE(FILLD_DT,'YYYYMMDD') AS Derived_date FROM SOURCE; 

は、念のために、それはエラーを返します。ミス解析を防止するために、ユーザ定義関数とcase文を使用してそれらのレコードをスキップすることができます。有効な日付であるかどうかを検証するために

CREATE TABLE SOME_DATA (
    NUMBER_DATE NUMBER(8) 
); 

INSERT INTO SOME_DATA VALUES(20170912); 
INSERT INTO SOME_DATA VALUES(20030530); 
INSERT INTO SOME_DATA VALUES(19901131); 
INSERT INTO SOME_DATA VALUES(20170731); 
INSERT INTO SOME_DATA VALUES(20170230); 
COMMIT; 

機能:

一部のデータが一緒にプレイする

CREATE OR REPLACE FUNCTION IS_DATE(V_DATE IN VARCHAR2) RETURN NUMBER IS 
    V_DATE1 DATE; 
BEGIN 
    SELECT TO_DATE(V_DATE,'YYYYMMDD') INTO V_DATE1 FROM DUAL; 
     RETURN 1; 
    EXCEPTION WHEN OTHERS THEN 
     RETURN 0; 
END; 

最後にクエリ:私は願っています

SELECT 
    CASE IS_DATE(NUMBER_DATE) 
     WHEN 1 THEN TO_DATE(NUMBER_DATE,'YYYYMMDD') 
     ELSE NULL 
    END AS Derived_date,NUMBER_DATE 
FROM SOME_DATA ; 

User defined function

関連する問題