我已经看到类似的帖子,但我无法解决我的查询 .
我试图查询具有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"
4 回答
看来你只需要正确的格式:
当你在to_date()中使用格式说明符时,它的作用是尝试以格式说明符的格式映射 exactly 列中的值,而不是更少的格式,而不是更多 .
因此,当您使用
TO_DATE(VALUE, 'MM/DD/YYYY')
时,它会尝试映射前2个字符,即20为MM
. 因此它将错误报告为not a valid month
.您需要一个适当的格式说明符来处理列,如下所示 -
它将输出像 -
稍后您可以使用to_char并使用适当的格式说明符再次根据您的要求格式化此输出 .
这将产生如下输出 -
请注意,没关系是你的值包含am或pm,你可以同时使用am或pm . 我的意思是,具有讽刺意味的是,如果值中包含'am',则不必使用'am' . 即使值包含'am',也可以使用'pm' . 并不是说这样使用它有多大意义,仍然只是一个FYI .
首先要了解to_date和to_char函数的用法:
TO_CHAR: 要将日期或数字等其他数据类型更改为字符串,如果要将日期更改为字符,则必须指定应将其转换为的日期格式 .
TO_DATE 要将字符串/字符更改为日期,第二个参数是您的字符串的日期格式,字符串"20150901092520 AM"的日期格式为"YYYYMMDDHHMISS AM",因此您可以将其用作
to_date('20150901092520 AM','YYYYMMDDHHMISS AM'),这会将它转换为日期对象,现在打印所需的格式为“09/01/2015”使用to_char并指定格式为“MM / DD / YYYY”下面
to_char(to_date('20150901092520 AM', 'YYYYMMDDHHMISS AM'),'MM/DD/YYYY')
您应该能够在转换https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_1106.htm之前使用ISDATE函数来测试字符串
一般......
SELECT cust_last_name, CASE value WHEN isdate(value) = 'Yes' THEN convert(date,value) WHEN isdate(value) <> 'Yes' THEN '' END FROM TABLE;