2017-11-06 16 views
0

私はあなたがタイムスタンプされていない時間列内のデータを見ることができますが、文字列は、したがって、データの一部が間違っていて、この(文字列の組み合わせ)

Day Month Time 
11 02 12:11:11 
12 02 10:10:20 
13 02 9:12:6 
14 02 6:7:2 

のように見えるデータを持っていますこのようなフォーマットは、9:12:6ではなく09:12:06です。 私が今やりたいことは、文字列「曜日」と「月」と正しい時刻形式を組み合わせた新しいColumです。「:」を削除する必要があります。 結果は次のようになります必要があります。

new Colum 
1102121111 
1202101020 
1302091206 
1402060702 

あなたは私を助けてくださいことはできますか? おかげ


CREATE TABLE Saletime (
day VARCHAR(02) NOT NULL, 
month VARCHAR(02) NOT NULL, 
time VARCHAR(10) NOT NULL); 

INSERT INTO saletime(day, month, time) VALUES ('11','02','12:11:11'); 
INSERT INTO saletime(day, month, time) VALUES ('12','02','10:10:20'); 
INSERT INTO saletime(day, month, time) VALUES ('13','02','9:12:6'); 
INSERT INTO saletime(day, month, time) VALUES ('14','02','6:7:2'); 
+0

どのDBMSを使用していますか?それに応じてタグを付けてください。 3つの列を特殊文字なしで連結したいだけですか? – kchason

+0

申し訳ありませんが、私たちはoracle DBを使用して、私はちょうど特別なcharaterなしconcatenatethemにしたい – phalondon

+0

しかし、あなたはまた、先頭の0が正しい必要がありますか? – kchason

答えて

0

入力と出力はすべて文字列であるため、おそらく直接的な文字列操作が意味をなさないでしょう。 (出力はdateデータ型であればそれは、ずっと良いだろうが、それはない鉱山で、あなたの手の中にある。)

私はとして列名を使用して、あなたのリードに従ってください。それは非常に貧しい習慣です。実際の列名が異なることを願っています。

曜日と月に同じ左パディングと0が必要な場合は不明です。ちょうどの場合には、私もそれを扱った(それは同じように行われた)。

select day, month, time, 
     lpad(day, 2, '0') || lpad(month, 2, '0') 
     || lpad(regexp_substr(time, '\d+', 1, 1), 2, '0') 
     || lpad(regexp_substr(time, '\d+', 1, 2), 2, '0') 
     || lpad(regexp_substr(time, '\d+', 1, 3), 2, '0') as new_string 
from saletime; 

DATE MONTH TIME  NEW_STRING 
---- ----- --------- ---------- 
    11  02 12:11:11 1102121111 
    12  02 10:10:20 1202101020 
    13  02 9:12:6  1302091206 
    14  02 6:7:2  1402060702 
2

連結した値は、次にあなたが数値計算としてこれを行うことができます

select to_char(
    to_timestamp(
    day||'-'||month||' '||time, 
    'DD-MM HH24:MI:SS'), 
    'DDMMHHMISS') 
from Saletime; 

SQL Fiddle example

+0

私が疑っているように、OPの入力が24時間形式であれば、 'to_timestamp'は正しく書かれているように失敗します。 'to_date'と同じです(私は' to_timestamp'が必要な理由は分かりませんが、ここで使うのはちょっと変わった、間違っていない)。 – mathguy

+0

また、表名と列名を二重引用符で囲むと、Oracle Databaseでは問合せが失敗します。二重引用符で囲まずに二重引用符で囲まれた名前を使用しないでください。 (この場合はそうではありませんでした!) – mathguy

-1

それらを解析:

select (day * 100000000 + 
     month * 1000000 + 
     cast(regexp_substr(time, '[0-9]+', 1, 1) as number) * 10000 + 
     cast(regexp_substr(time, '[0-9]+', 1, 2) as number) * 100 + 
     cast(regexp_substr(time, '[0-9]+', 1, 3) as number) * 1 
     ) 
from saletime; 

HereはSQL Fiddleです。

文字列として使用する場合は、文字列に変換するだけです。

+0

作業中のソリューションをなぜダウンボートしますか? –

+0

同時に、間違った解決策がアップアップされています...私を倒してください! – mathguy

+0

...あなたの答えは数字を生成します。元の質問が示唆し、OPは明示的にコメントの中で、結果が文字列であることを明示します。特に1日と1〜9の間であれば、OPが先頭に0を付けたいと思うかもしれません。したがって、必要なときに先頭の0を保証する書式マスクを使用して、文字列にキャストする必要があります。 – mathguy

関連する問題