Oracle:从TimeStamp

时间:2017-03-21 10:48:22

标签: oracle plsql timestamp to-date

我在列中有时间戳,例如 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

请帮助我,让年和月形成这样的价值观。

基兰。

4 个答案:

答案 0 :(得分:2)

您需要使用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;

这是假设一年又一个月。在格式部分,您还需要提供日期格式,而不仅仅是时间部分。

答案 1 :(得分:0)

我看到的问题是你没有指定&#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;

答案 2 :(得分:0)

如果您打算在查询中使用timestamp列,则表示您不会遇到问题(此示例基于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。如果不需要小数秒,则没有时间戳列 - 日期类型就足够了。

答案 3 :(得分:0)

谢谢你们。这是一个很大的帮助,欣赏它。我使用了以下查询,

  1. 获得年份:

    选择EXTRACT(年份来自(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. 选择EXTRACT(MONTH FROM(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 来自双重;

相关问题