【发布时间】:2020-03-16 17:09:13
【问题描述】:
我正在尝试使用正则表达式从包含日期和时间的列中拆分日期和时间。
前- 当前:
+------------------------------+
| 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 |
+------------------------------+------------------------------+
不太清楚我哪里出错了?
【问题讨论】:
-
你得到的意味着没有被替换,在任何一次尝试中。这意味着您编写的正则表达式与输入字符串不匹配。几乎可以肯定的原因(或主要原因之一)是您错误地使用了反斜杠。它应该只用于逃避需要逃避的东西。例如,空间不需要转义。 Dash 不需要转义(它是一个常规字符,除非在一个无论如何都不能转义的字符类中)。等等。
-
当然,通过更正您的数据模型,可以避免所有这些喧嚣。日期和时间应始终存储在 DATE 或 TIMESTAMP 的某些变体中。两种数据类型都包含日期和时间组件,将两者分开只是正确使用 TO_CHAR 函数的简单问题。