代码之家  ›  专栏  ›  技术社区  ›  FrustratedWithFormsDesigner

带季度格式的Oracle to\ U date函数

  •  2
  • FrustratedWithFormsDesigner  · 技术社区  · 16 年前

    ...and r.record_create_date between to_date('2008 4','YYYY Q')
                                    and to_date('2010 1','YYYY Q')
    

    但甲骨文说: ORA-01820: format code cannot appear in date input format . 这个 Q 是一个有效的日期格式符号,所以我不确定发生了什么。这甚至是一个有效的方法来寻找日历季度之间的值,还是有更好的方法?


    如果我这样做的话,也很有趣,而且可能是相关的:

    select to_date('2009','YYYY') from dual;
    

    在我的IDE中显示的值是 2009-08-01 2009-08-04 ,自 今天 2010-08-04 .

    这是:

    select to_date('2009 1','YYYY Q') from dual;
    

    (Oracle 10g)

    5 回复  |  直到 16 年前
        1
  •  4
  •   Shannon Severance    16 年前

    ORA-01820: format code cannot appear in date input format Q 是一个有效的日期格式符号,所以我不确定发生了什么。

    http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34948 . 在转换为日期、时间戳等时,不允许所有格式元素。

    我建议不要在日期范围检查中使用between。人们往往会错过在最后一天的价值观,预计将包括。所以我要翻译:

    and r.record_create_date between to_date('2008 4','YYYY Q')
                                 and to_date('2010 1','YYYY Q')
    

    and to_date('2008-10-01', 'YYYY-MM-DD') <= r.record_create_date 
    and record_create_date < to_date('2010-04-01', 'YYYY-MM-DD') -- < beginning of 2Q2010.
    
        2
  •  1
  •   OMG Ponies    16 年前

    有人在OTN上问了同样的问题: http://forums.oracle.com/forums/thread.jspa?threadID=1081398&tstart=255

    问题的关键是你可以 在“截止日期”函数中指定“Q”。

    整个的 to_date('2010 1','YYYY Q') 如果你真的想要2010年3月31日,我会给你2010年1月1日。。。在午夜前一秒。

        3
  •  1
  •   Patrick Marchand    16 年前

    由于季度和月份之间的关系是一对多的,所以在截止日期('2008 1','yyyy q')这样做是没有意义的;应该返回什么日期?一季度的第一天,一季度的最后一天(另一方面,将一个日期转换为一个季度(比如to_CHAR(SYSDATE,'yyyyy q')是有意义的,因为一个特定的日期只存在于一个季度中。)

    另请注意,如果有人考虑不使用TO\u DATE,请不要使用诸如:WHERE DATE\u value介于'DATE string1'和'DATE string2'之间,而不使用TO\u DATE函数。它采用默认的日期格式,在某些情况下可以完全避免使用可能有用的索引。

    select sysdate from dual where sysdate between '1-Jan-10' and '31-Dec-10';
    
    
    SYSDATE
    ---------
    04-AUG-10
    
    SQL> alter session set nls_date_format = 'YYYY-MM-DD';
    
    Session altered.
    
    SQL> select * from dual where sysdate between '1-Jan-10' and '31-Dec-10'; 
    
    no rows selected
    

        4
  •  0
  •   jle    16 年前

    我认为最好的方法是只输入季度开始日期和季度结束日期,而不必担心结束日期。我想如果你用

    between '1-Jan-10' and '31-Dec-10'
    

    例如,那么你就不需要(在甲骨文中我相信)去约会了,而且这并不比输入季度号困难多少

        5
  •  0
  •   alvalongo    8 年前

    我用事实

    开始月份=-2+3*季度

    上月=3*季度

    variable v_year    number
    
    variable v_quarter number
    
    exec :v_year     :=2017
    
    exec :v_quarter:=4
    
    select :v_year    as year,
           :v_quarter as quarter,
           to_date(:v_year||to_char(-2+3*:v_quarter,'fm00'),'yyyymm')        as quarter_start,
           last_day(to_date(:v_year||to_char(3*:v_quarter,'fm00')||'01 23:59:59','yyyymmdd hh24:mi:ss')) as quarter_end
    from dual a;
    
    
    YEAR|QUARTER|QUARTER_START      |QUARTER_END        
    2017|      4|2017-10-01 00:00:00|2017-12-31 23:59:59