怎么做这个Query(字符串组合)

时间:2017-11-06 20:16:24

标签: sql oracle

我的数据看起来像这样

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,它结合了Day,Month和正确的时间格式字符串,":"需要删除。 结果应如下所示:

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');

3 个答案:

答案 0 :(得分:2)

连接值然后解析它们

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

SQL Fiddle example

答案 1 :(得分: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 :(得分:-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小提琴。

如果您希望将其作为字符串,只需将其转换为字符串。