【问题标题】:Error: ORA-01848: day of year must be between 1 and 365 (366 for leap year) while extracting month and year from DateColumn(varchar(10))错误:ORA-01848:从 DateColumn(varchar(10)) 中提取月份和年份时,一年中的某一天必须介于 1 和 365 之间(闰年为 366)
【发布时间】:2020-09-07 19:54:29
【问题描述】:
SELECT TO_CHAR(TO_DATE(Column_d, 'dd/mm/yyyy'), 'YYYY-MM') as Date_y FROM Table_d

甚至想从同一日期获得季度,这再次给了我错误 ORA-01848 之类的

SELECT (CASE WHEN (TO_CHAR(TO_DATE(Column_d, 'dd/mm/yyyy'), 'mm')) IN ('01','02','03') THEN 'Q1'
WHEN (TO_CHAR(TO_DATE(Column_d, 'dd/mm/yyyy'), 'mm')) IN ('04','05','06') THEN 'Q2'
WHEN (TO_CHAR(TO_DATE(Column_d, 'dd/mm/yyyy'), 'mm')) IN ('07','08','09') THEN 'Q3'
ELSE 'Q4' END as QTR
FROM Table_d


【问题讨论】:

    标签: oracle date datetime oracle11g sql-date-functions


    【解决方案1】:

    在我看来,您发布的任何内容都不会返回 ORA-01848。它通常与 DDD 日期格式掩码相关,它表示一年中的天数。

    例如,这是正确的,因为日期编号 001 等于 1 月 1 日:

    SQL> select to_date('001-2020', 'ddd-yyyy') from dual;
    
    TO_DATE('0
    ----------
    01.01.2020
    

    这会返回 ORA-01848,因为在这一年(也没有任何一年)没有第 405 天:

    SQL> select to_date('405-2020', 'ddd-yyyy') from dual;
    select to_date('405-2020', 'ddd-yyyy') from dual
                   *
    ERROR at line 1:
    ORA-01848: day of year must be between 1 and 365 (366 for leap year)
    

    所以:如果您正在做这样的事情,请确保存储的值是正确的;我想不是所有的都是。

    此外,当人们将日期作为字符串存储到 VARCHAR2(而不是 DATE 数据类型)列时,就会发生这种情况。我不是说你是原因,但你肯定是这里的受害者


    [编辑]

    朱利安日期,嗯?在评论中,您说您使用了这样的查询:

    Select TO_CHAR(TO_DATE(Julian_dateColumn+1900000, 'YYDDD'), 'YYDDD'), 'DD/MM/YYYY') as column_d from sometable
    

    我怀疑它是无效的(我想你有多余的, 'YYDDD'))。

    无论如何,我不知道你为什么试图以这种方式“转换”朱利安日期。有一种简单而正确的方法可以做到这一点。方法如下:

    这是今天的日期 (21.05.2020),以儒略日期表示:

    SQL> select to_char(sysdate, 'j') julian from dual;
    
    JULIAN
    -------
    2458991
    

    这是您存储在表中的值。为了将其转换为您想要的格式 (yyddd),您需要

    SQL> select to_char(to_date(2458991, 'j'), 'yyddd') as column_d from dual;
    
    COLUM
    -----
    20142
    

    我建议您使用它而不是您当前拥有的代码,即

    SQL> create or replace view table_d as
      2    select to_char(to_date(julian_datecolumn, 'j'), 'yyddd') as column_d
      3    from sometable;
    
    View created.
    
    SQL> select * From table_d;
    
    COLUM
    -----
    20142
    
    SQL>
    

    【讨论】:

    • 您好,该列是从另一个表派生的,并且是从儒略日期转换而来的。
    • ` create view table_d as Select TO_CHAR(TO_DATE(Julian_dateColumn+1900000, 'YYDDD'), 'YYDDD'), 'DD/MM/YYYY') as column_d from sometable; ` 然后如果我使用这个表(列)来提取年份和月份,那么我会收到错误 ORA-01848。
    • 据我所知,你做错了。我编辑了我的答案并发布了更多信息。请看一下。
    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多