Sql 如何执行此查询(字符串组合)

Sql 如何执行此查询(字符串组合),sql,oracle,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。 我现在想做的是一个新的列,它结合了日、月和正确的时间格式字符串:需要删除。 结果应该如下所示: new Colum 1102121111 1202101020 13020912

我有这样的数据

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。 我现在想做的是一个新的列,它结合了日、月和正确的时间格式字符串:需要删除。 结果应该如下所示:

new Colum
1102121111
1202101020
1302091206
1402060702
你能帮帮我吗? 谢谢


连接这些值,然后解析它们

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

您可以将其作为数值计算:

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;
这是一个SQL小提琴


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

因为输入和输出都是字符串,所以直接字符串操作可能有意义。如果输出是日期数据类型会更好,但那是你的,不是我的

我跟随您使用日和月作为列名。这是一种非常糟糕的做法;我希望您的实际列名不同

现在还不清楚你是否需要在白天和月份使用相同的左边填充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

您使用的是哪种数据库管理系统?请贴上相应的标签。所以,您只想将三个列连接起来而不使用特殊字符?抱歉,我们使用oracle DB,我只想将它们连接起来而不使用特殊字符,但您还需要正确的前导0?是的,kchason,我需要0表示错误的格式是否可以将saletime设置为时间戳列并用于\u CHARsaletime,DDMMHHMISS能否达到同样的结果?正如我所怀疑的那样,如果OP的输入是24小时格式的,to_时间戳将完全失败。与to_date相同,我不明白为什么需要使用时间戳,但在这里使用时间戳很奇怪,它没有错误。此外,如果您将表名和列名用双引号括起来,则在Oracle数据库中查询将失败;不要使用双引号的名称,除非它们是用双引号定义的。在这种情况下,他们不是!同时,一个错误的解决方案被否决了。。。太棒了!虽然你的答案产生一个数字;最初的问题建议,然后OP在注释中明确指出,所需的结果是一个字符串。特别是如果一天在1到9之间,人们可能会猜测OP想要领先的0。因此,您的答案必须转换为字符串,并带有一个格式掩码,在需要时保证前导0。@mathguy。在问题中,它在哪里说结果应该是字符串?我现在想做的是一个新的列,它结合了日、月和正确的时间格式字符串:需要删除。结果应该是这样的:没有任何东西表明结果是字符串-尽管将数值转换为字符串非常简单。。。需要删除:仅当结果是字符串时才有意义;如果结果是一个日期,那就没有意义了。正如你所知,一个日期既不带冒号也不带冒号——尽管这给了OP很大的信任。但这种怀疑随后在一条评论中得到了明确的证实,这条评论似乎是在你的回答前一个小时发布的,不确定是谁,或者为什么。和你一样,我强烈怀疑这是否是OP。该网站充满了一个由傻瓜驾驶的游戏。你知道,那些投反对票却不给出理由的人。顺便说一句——当然——否决票不是我投的;我总是解释我的反对票。有时我错了,但那是另一回事。
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