(Oracle)SQL中的正则表达式将日期/时间分割为单独的日期和时间列

问题描述 投票:0回答:3

我正在尝试使用正则表达式从同时包含日期和时间的列中拆分日期和时间。

Ex-当前:

+------------------------------+
|           original           |
+------------------------------+
| 21-JAN-16 01.20.51.097679 PM |
| 02-FEB-16 01.32.53.469568 PM |
| 01-DEC-15 06.00.41.315710 AM |
| 14-JAN-16 04.11.53.107373 PM |
| 21-JAN-16 01.05.15.113135 PM |
| 03-FEB-16 12.06.10.128735 PM |
| 04-FEB-16 06.24.59.557983 PM |
+------------------------------+

所需:

+-------------+-------------+
|    date     |    time     |
+-------------+-------------+
| 21-JAN-2016 | 01:20:51 PM |
| 02-FEB-2016 | 01:32:53 PM |
| 01-DEC-2015 | 06:00:41 AM |
| 14-JAN-2016 | 04:11:53 PM |
| 21-JAN-2016 | 01:05:15 PM |
| 03-FEB-2016 | 12:06:10 PM |
| 04-FEB-2016 | 06:24:59 PM |
+-------------+-------------+

数据类型是VARCHAR2。

这是我尝试过的:

SELECT
REGEXP_REPLACE(original,
  '([[:digit:]]{2})\-([[:alpha:]]{3})\-([[:digit:]]{2})\ ([[:digit:]]{2})\.([[:digit:]]{2})\.([[:digit:]]{2})\.([[:digit:]]{1,}\.([[:alpha:]]{2}))',
  '\1-\2-20\3') "date",

REGEXP_REPLACE(original,
  '([[:digit:]]{2})\-([[:alpha:]]{3})\-([[:digit:]]{2})\ ([[:digit:]]{2})\.([[:digit:]]{2})\.([[:digit:]]{2})\.([[:digit:]]{1,}\.([[:alpha:]]{2}))',
  '\4:\5:\6 \7') "time"
FROM database.table

这是我执行以上操作时得到的:

+------------------------------+------------------------------+
|             date             |             time             |
+------------------------------+------------------------------+
| 21-JAN-16 01.20.51.097679 PM | 21-JAN-16 01.20.51.097679 PM |
| 02-FEB-16 01.32.53.469568 PM | 02-FEB-16 01.32.53.469568 PM |
| 01-DEC-15 06.00.41.315710 AM | 01-DEC-15 06.00.41.315710 AM |
| 14-JAN-16 04.11.53.107373 PM | 14-JAN-16 04.11.53.107373 PM |
| 21-JAN-16 01.05.15.113135 PM | 21-JAN-16 01.05.15.113135 PM |
| 03-FEB-16 12.06.10.128735 PM | 03-FEB-16 12.06.10.128735 PM |
| 04-FEB-16 06.24.59.557983 PM | 04-FEB-16 06.24.59.557983 PM |
+------------------------------+------------------------------+

不太确定我出了错吗?

sql regex oracle syntax
3个回答
1
投票

Oracle具有用于处理日期和时间的多种功能。 [reduces your problem

SELECT TO_TIMESTAMP(original, 'DD-MON-RR HH:MI:SS.FF AM') as ORIGINAL_VALUE,
TO_TIMESTAMP(original, 'DD-MON-RR') AS DATE_ONLY,
TO_TIMESTAMP(original, 'HH:MI:SS.FF AM') AS TIME_ONLY
from database.table;

0
投票

由于您的数据非常常规,我完全不会使用正则表达式。 SUBSTR正常工作。

-- sample data
with orig as (select '21-JAN-16 01.20.51.097679 PM' as dt from dual)
-- query
select substr(dt,1,9) as d, substr(dt,11) as t
from orig;

但是您的正则表达式中的问题是,最后一个\.应该为\-这是PM前的空格,而不是句点。而且您不需要转义空格,因此可以是

'([[:digit:]]{2})\-([[:alpha:]]{3})\-([[:digit:]]{2}) ([[:digit:]]{2})\.([[:digit:]]{2})\.([[:digit:]]{2})\.([[:digit:]]{1,} ([[:alpha:]]{2}))'

0
投票

如果您的列originalvarchar2,则需要将其转换为timestamp amd,然后分别返回日期和时间,如下所示:

select 
to_char(to_timestamp(original,'dd-mon-rr hh.mi.ss.ff PM'), 'dd-mon-rr') as "DATE",
to_char(to_timestamp(original,'dd-mon-rr hh.mi.ss.ff PM'), 'hh:mi:ss PM') as "TIME",
from your_table

干杯!

© www.soinside.com 2019 - 2024. All rights reserved.