如何在Oracle中将Varchar2转换为时间?

问题描述

我的表中有2列都是varchar2。我有类似的查询

SELECT MYCOLUMN_TIME||' '||MYCOLUMN_TIME_AMPM 
FROM MYTABLE

我得到的输出是 0910am 。我尝试过

SELECT TO_CHAR(TO_DATE(MYCOLUMN_TIME,'hh24miss'),'hh24:mi:ss')||' '||MYCOLUMN_TIME_AMPM 
FROM MYTABLE

通过此查询,我得到输出 09:10:00 pm

我想要类似 21:10:00 pm 的输出。我们怎样才能做到这一点?请帮忙。

解决方法

使用HH24格式的掩码时,21小时等于9 PM。将PM21一起使用是没有意义的吗?

将带am / pm的字符串(0910)转换为日期时,可以使用带有适当格式掩码的TO_DATE函数。日期值-在Oracle中-同时包含日期和时间部分(在下面的示例中,请参见datum_1)。然后将TO_CHAR应用于这样的结果,以便根据需要显示它(同样,通过应用所需的格式掩码),即datum_2

例如:

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh:mi pm';

Session altered.

SQL> with mytable (mycolumn_time,mycolumn_time_ampm) as
  2    (select '0910','am' from dual union all
  3     select '1150','pm' from dual
  4    )
  5  select mycolumn_time,6         mycolumn_time_ampm,7                 to_date(mycolumn_time ||' '||mycolumn_time_ampm,'hhmi pm')             datum_1,8         --
  9         to_char(to_date(mycolumn_time ||' '||mycolumn_time_ampm,'hhmi pm'),'hh24:mi') datum_2
 10  from mytable;

MYCO MY DATUM_1             DATUM_2
---- -- ------------------- -------
0910 am 01.09.2020 09:10 AM 09:10
1150 pm 01.09.2020 11:50 PM 23:50

SQL>

如果添加PM格式的掩码,则会得到

  <snip>
  9         to_char(to_date(mycolumn_time ||' '||mycolumn_time_ampm,'hh24:mi pm') datum_2
 10  from mytable;                                                                        ^^
                                                                                          here
MYCO MY DATUM_1             DATUM_2
---- -- ------------------- --------
0910 am 01.09.2020 09:10 AM 09:10 AM
1150 pm 01.09.2020 11:50 PM 23:50 PM

SQL>

但是-正如我之前说的-这没有任何意义。没有例如23:50 AM,但在11:50 AM11:50 PM中完全有意义。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...