首页 > 解决方案 > 无法在 oracle sql 中将时间戳转换为字符或日期

问题描述

我需要将时间戳值(19-01-21 09:15:00.000000 PM)转换为日期格式('YYYY/MM/DD HH24:MI:SS')。我正在尝试使用 to_char 函数来完成它(将其转换为 varchar 并在 TO_DATE 函数中使用它)。我在 to_char 函数中遇到错误。这是可行的方法还是请建议是否有更好的方法

select TO_CHAR('19-01-21 09:15:00.000000 PM','DD-MM-YY HH:MI:SSxFF AM') from dual; 
select TO_DATE(TO_CHAR('19-01-21 09:15:00.000000 PM','DD-MM-YYYY HH:MI:SSxFF AM'),'YYYY/MM/DD HH24:MI:SS'  ) from dual;

我收到以下错误:

ORA-01722: invalid number
01722. 00000 -  "invalid number"
*Cause:    The specified number was invalid.
*Action:   Specify a valid number.

标签: sqloracledatetimestamp

解决方案


'19-01-21 09:15:00.000000 PM'是字符串文字;它不是一个DATETIMESTAMP数据类型。

由于您的字符串有小数秒,您可以使用TO_TIMESTAMP它来将其转换为TIMESTAMP数据类型:

SELECT TO_TIMESTAMP( '19-01-21 09:15:00.000000 PM', 'DD-MM-RR HH12:MI:SS.FF6 AM' )
         AS timestamp_value
FROM   DUAL;

哪个输出:

| TIMESTAMP_VALUE |
| :---------------------------- |
| 2021-01-19 21:15:00.000000000 |

如果您希望将值作为DATE数据类型,那么您可以将先前的输出CAST带到 a DATE

SELECT CAST(
         TO_TIMESTAMP( '19-01-21 09:15:00.000000 PM', 'DD-MM-RR HH12:MI:SS.FF6 AM' )
         AS DATE
       ) AS date_value
FROM   DUAL;

或者,如果小数秒总是为零:

SELECT TO_DATE( '19-01-21 09:15:00.000000 PM', 'DD-MM-RR HH12:MI:SS".000000" AM' )
         AS date_value
FROM   DUAL;

两者都输出:

| DATE_VALUE |
| :----------------- |
| 2021-01-19 21:15:00 |

db<>在这里摆弄


我需要将时间戳值转换为date/varchar值。

如果您想将值格式化为YYYY/MM/DD HH24:MI:SSthen ,您可以使用TO_TIMESTAMPthen TO_CHAR

SELECT TO_CHAR(
         TO_TIMESTAMP( '19-01-21 09:15:00.000000 PM', 'DD-MM-RR HH12:MI:SS.FF6 AM' ),
         'YYYY/MM/DD HH24:MI:SS'
       ) AS date_string
FROM   DUAL;

哪个输出:

| DATE_STRING |
| :----------------- |
| 2021/01/19 21:15:00 |

(注意:这会输出字符串数据类型而不是DATE数据类型;如果您想要DATE数据类型,请使用第二个或第三个示例。)

db<>在这里摆弄


推荐阅读