首页 > 解决方案 > 如何在 Oracle 中将 Varchar2 转换为时间?

问题描述

我的表中有 2 列都是 varchar2。我有一个像这样的查询

SELECT MYCOLUMN_TIME||' '||MYCOLUMN_TIME_AMPM 
FROM MYTABLE

我得到输出0910 am。我努力了

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

通过这个查询,我得到了 Output 09:10:00 pm

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

标签: oracledatetimeoracle11gplsqldeveloper

解决方案


使用HH24格式掩码时,21小时等于9 PM. PM和 在一起没有意义21,不是吗?

当您将与 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, 'hhmi pm'), '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>

但是 - 正如我之前所说 - 这没有意义。没有 eg ,但它在or23:50 AM中非常有意义。11:50 AM11:50 PM


推荐阅读