【发布时间】:2015-02-01 20:20:34
【问题描述】:
我有一列时间戳以 HH:MM:SS 格式存储为 varchars,我需要找出每个时间戳包含多少秒。
有没有一种方法可以使用正则表达式来获取每个冒号之前的值并将它们存储为单独的数值?
基本上,我需要一个将 16:38:14 拆分为的表达式:
HH | MM | SS
16 | 38 | 14
感谢您提供的任何帮助或建议。
【问题讨论】:
我有一列时间戳以 HH:MM:SS 格式存储为 varchars,我需要找出每个时间戳包含多少秒。
有没有一种方法可以使用正则表达式来获取每个冒号之前的值并将它们存储为单独的数值?
基本上,我需要一个将 16:38:14 拆分为的表达式:
HH | MM | SS
16 | 38 | 14
感谢您提供的任何帮助或建议。
【问题讨论】:
使用substr():
select substr(val, 1, 2) as hh, substr(val, 4, 2) as mm, substr(val, 7, 2) as ss
如果您想要这些作为数字,那么也使用to_number():
select to_number(substr(val, 1, 2)) as hh,
to_number(substr(val, 4, 2)) as mm,
to_number(substr(val, 7, 2)) as ss
【讨论】:
首先,将DATETIME 存储为VARCHAR2 数据类型是个坏主意。您应该始终使用DATE 或TIMESTAMP。日期data type 具有日期和时间部分。改变设计并消除缺陷永远不会太晚。
使用DATE/TIMESTAMP 数据类型,您只需要TO_CHAR 即可以所需格式显示日期。
SQL> alter session set nls_date_format='MM/DD/YYYY HH24:MI:SS';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
12/04/2014 10:38:56
SQL> select to_char(sysdate, 'hh24:mi:ss') as "time_portion" from dual;
time_por
--------
10:39:21
SQL>
【讨论】: