Oracle:从时间戳中提取年份和月份时出错

Oracle : Error while Extracting Year and Month from TimeStamp

我在列中有时间戳值,例如30/05/06 11:40:34.000000000 AM。我需要从此值中提取年份(即 2006 年)和月份(即 05)。下面是我的 SQL.

SELECT EXTRACT(YEAR FROM TO_DATE('19/10/09 10:45:44.000000000 AM')) FROM DUAL;

在运行上面SQL之后,我得到一个错误APPROVED_PROPOSALS

所以,我尝试提供如下格式,

SELECT EXTRACT(YEAR FROM TO_DATE('19/10/09 10:45:44.000000000 AM','HH12:MI:SS.FF')) FROM DUAL;

但是,仍然出现一些错误。我很确定,我提供的格式不正确。

ORA-01821: date format not recognized

请帮助我,从这些值中获取年份和月份。

基兰。

您需要使用 TO_TIMESTAMP 而不是 TO_DATE

SELECT EXTRACT (
      YEAR FROM TO_TIMESTAMP ('19/10/09 10:45:44.000000000 AM',
                              'DD/MM/YY HH12:MI:SS.FF9 AM'))
FROM DUAL;

这是假设年复一年。在格式部分,你还需要给出日期的格式,而不仅仅是时间部分。

我看到的问题是您没有在日期格式中指定 'dd/mm/yy'。正如 Nitish 指出的那样,您有时间戳(更准确),而不是日期。

您应该使用正确的格式,如下:

SELECT EXTRACT(YEAR FROM TO_TIMESTAMP('19/10/09 10:45:44.00000 AM', 'dd/mm/yy HH12:MI:SSXFF PM')) FROM DUAL;

或者我们固定的决心:

select substr('19/10/09 10:45:44.00000 AM', 4,2) MONTH 
     , substr('19/10/09 10:45:44.00000 AM', 7,2) YEAR
from dual;

如果您计划在查询中使用时间戳列,则不会遇到您提到的问题(此示例基于 Nitish 的回答):

with t as
(
  select to_timestamp('19/10/2009 10:45:44.000000000 am', 'dd/mm/yyyy hh:mi:ss.ff9 am') ts
    from dual
)
select extract(year from ts) ts_year,
       extract(month from ts) ts_month
  from t;

此外,我建议您检查此列中是否存储了小数秒,因为在您的示例中它们没有。这通常意味着您要在此列中插入 sysdate,而不是 systimestamp。如果不需要小数秒,则没有必要使用时间戳列 - 日期类型就足够了。

谢谢大家。这是一个很大的帮助,非常感谢。我使用了以下查询,

  1. 获取年份:

    select 摘录(年份(TO_DATE(TO_CHAR(TO_TIMESTAMP ('15/10/09 11:07:28.999900 AM', 'DD/YY/MM HH:MI:SS.FF a.m.'),'DD/YY/MM HH24:MI:SS'), 'DD/YY/MM HH24:MI:SS'))) DT 来自双;

  2. select 摘录(月份来自(TO_DATE(TO_CHAR(TO_TIMESTAMP ('15/10/09 11:07:28.999900 AM', 'DD/YY/MM HH:MI:SS.FF a.m.'),'DD/YY/MM HH24:MI:SS'), 'DD/YY/MM HH24:MI:SS'))) DT 来自双;