首页 文章

将存储为VARCHAR2的日期转换为日期

提问于
浏览
0

我已经看到类似的帖子,但我无法解决我的查询 .

我试图查询具有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 回答

  • 0

    看来你只需要正确的格式:

    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
    
  • -2

    当你在to_date()中使用格式说明符时,它的作用是尝试以格式说明符的格式映射 exactly 列中的值,而不是更少的格式,而不是更多 .

    因此,当您使用 TO_DATE(VALUE, 'MM/DD/YYYY') 时,它会尝试映射前2个字符,即20为 MM . 因此它将错误报告为 not a valid month .

    您需要一个适当的格式说明符来处理列,如下所示 -

    SELECT TO_DATE(VALUE,'yyyymmddhhmiss am')来自TIMINGEVENT

    它将输出像 -

    9/1/2015 9:25:20 AM

    稍后您可以使用to_char并使用适当的格式说明符再次根据您的要求格式化此输出 .

    从TIMINGEVENT中选择to_char(TO_DATE(VALUE,'yyyymmddhhmiss am'),'DD-MON-YYYY HH12:MI:SS AM')

    这将产生如下输出 -

    01-SEP-2015 09:25:20 AM

    请注意,没关系是你的值包含am或pm,你可以同时使用am或pm . 我的意思是,具有讽刺意味的是,如果值中包含'am',则不必使用'am' . 即使值包含'am',也可以使用'pm' . 并不是说这样使用它有多大意义,仍然只是一个FYI .

  • 0

    首先要了解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')

  • 1

    您应该能够在转换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;

相关问题