【问题标题】:Oracle : Error while Extracting Year and Month from TimeStampOracle:从时间戳中提取年份和月份时出错
【发布时间】:2017-03-21 10:48:21
【问题描述】:

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

请帮助我,以获取此类值的年份和月份。

基兰。

【问题讨论】:

  • 为什么在查询中使用字符串,而不是直接从时间戳数据类型的列中提取?

标签: oracle plsql timestamp to-date


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您打算在查询中使用时间戳列,则不会遇到您提到的问题(此示例基于 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】:

      我看到的问题是您没有在日期格式中指定“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;
      

      【讨论】:

        【解决方案4】:

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

        1. 获取年份:

          选择 EXTRACT(YEAR 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 从双;

        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 从双;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-20
          • 2020-12-24
          • 2015-05-23
          • 1970-01-01
          • 1970-01-01
          • 2018-02-16
          • 2021-08-31
          • 1970-01-01
          相关资源
          最近更新 更多