我见过类似的帖子,但我无法解决我的问题。
我正在尝试查询具有VARCHAR2数据类型的列(“VALUE”)的表。
此列中的行与数值和日期值混合(我不知道为什么日期存储为VARCHAR2)。
我只需要日期,我已经用LIKE函数过滤了行。
SELECT
PARENTID,
NAME,
VALUE
FROM TIMINGEVENT
WHERE NAME like 'last%'
;
现在该列只有日期,我需要从VARCHAR2转换为日期。
PARENTID ++ NAME ++ VALUE
1701480 ++ lastCycle1 ++
1701480 ++ lastCycle2 ++
1701480 ++ lastCycle3 ++ 20150901092520 AM
1701480 ++ lastCycle4 ++ 20150901092834 AM
1701480 ++ lastCycle5 ++ 20150901085047 AM
我尝试使用TO_DATE导致以下错误:
ORA-01858:找到了一个非数字字符,其中数字是预期的
我使用的是Oracle 11g SQL Developer,日期格式的NLS首选项设置为DD-MON-RR。
我在另一篇文章中找到了以下方法,但是当我使用它时会抛出以下错误?
SELECT
PARENTID,
NAME,
VALUE,
TO_CHAR(TO_DATE(VALUE, 'MM/DD/YYYY'), 'MM/DD/YYYY') AS "test"
FROM TIMINGEVENT
WHERE NAME like 'last%'
;
ORA-01843: not a valid month
01843. 00000 - "not a valid month"
答案 0 :(得分:1)
您似乎只需要正确的格式:
with test(parentId, name, value) as (
select '1701480','lastCycle1','' from dual union all
select '1701480','lastCycle2','' from dual union all
select '1701480','lastCycle3','20150901092520 AM' from dual union all
select '1701480','lastCycle4','20150901092834 AM' from dual union all
select '1701480','lastCycle5','20150901085047 AM' from dual
)
select to_date(value, 'YYYYMMDDHHMISS AM')
from test
答案 1 :(得分:0)
当你在to_date()中使用格式说明符时,它的作用是尝试以格式说明符的格式映射完全列中的值,而不是更少,不是更多。
因此,当您使用TO_DATE(VALUE, 'MM/DD/YYYY')
时,它会尝试映射前2个字符,即20 MM
。因此它将错误标记为not a valid month
。
您需要一个合适的格式说明符来处理该列,如下所示 -
SELECT OF_DATE(VALUE,' yyyymmddhhmiss am')来自TIMINGEVENT
它会输出类似 -
9/1/2015 9:25:20 AM
稍后您可以使用to_char并再次使用正确的格式说明符,根据您的要求再次格式化此输出。
SELECT to_char(TO_DATE(VALUE,' yyyymmddhhmiss am'),' DD-MON-YYYY HH12:MI:SS AM')来自TIMINGEVENT
这将产生类似 -
的输出01-SEP-2015 09:25:20 AM
请注意,没关系是你的价值包含am或pm,你可以同时使用am或pm。我的意思是,具有讽刺意味的是,使用“am”并不是强制性的。如果该值包含' am'在里面。你可以使用' pm'即使价值包含' am'也是如此。并不是说用这种方式很有意义,还只是一个FYI。
答案 2 :(得分:0)
首先要了解to_date和to_char函数的用法:
<强> TO_CHAR:强> 要将日期或数字等其他数据类型更改为字符串,如果要将日期更改为字符,则必须指定应将其转换为的日期格式。
<强> TO_DATE 强> 要将字符串/字符更改为日期,第二个参数是您的字符串的日期格式,字符串的日期格式&#34; 20150901092520 AM&#34;是&#34; YYYYMMDDHHMISS AM&#34;,所以你用它作为
to_date(&#39; 20150901092520 AM&#39;,&#39; YYYYMMDDHHMISS AM&#39;),这会将其转换为日期对象,现在打印所需格式为&#34; 09/01/20& #34;使用to_char并将格式指定为&#34; MM / DD / YYYY&#34;如下所示
to_char(to_date(&#39; 20150901092520 AM&#39;,&#39; YYYYMMDDHHMISS AM&#39;),&#39; MM / DD / YYYY&#39;)
答案 3 :(得分:-2)
您应该能够使用ISDATE函数在转换之前测试字符串 https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_1106.htm
...一般
SELECT cust_last_name,
CASE value WHEN isdate(value) = 'Yes' THEN convert(date,value)
WHEN isdate(value) <> 'Yes' THEN ''
END
FROM TABLE;