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