Oracle Sql只获取date和year数据类型的月份和年份

时间:2011-07-21 18:53:41

标签: oracle11g

我想只在oracle数据类型中存储月份和年份。

我有一个名为'01 -FEB-2010'的日期存储在名为time_period的列中。

为了只获得月份和年份,我写了一个像

这样的查询
select to_char(time_period,'MON-YYYY') from fact_table;

我将结果视为'FEB-2010',这很好,但唯一的问题是它是varchar数据类型。

所以我确实喜欢

select to_date(to_char(time_period,'MON-YYYY'),'MON-YYYY') from fact_table

我得到01-FEB-2010。是否无法仅在日期数据类型

中存储FEB-2010

3 个答案:

答案 0 :(得分:18)

最简单的解决方案是使用正确的数据类型创建列:DATE

例如:

  1. 创建表格:

    创建表test_date(mydate date);

  2. 插入行:

    插入test_date值(to_date('01 -01-2011','dd-mm-yyyy'));

  3. 要获得月份和年份,请执行以下操作:

    select to_char(mydate, 'MM-YYYY') from test_date;
    

    您的结果如下:01-2011

    另一个很酷的功能是“提取”

    select extract(year from mydate) from test_date;
    

    这将返回:2011

答案 1 :(得分:6)

“FEB-2010”不是日期,因此将它存储在日期列中没有多大意义。

您可以使用上面显示的TO_CHAR逻辑,在“MON-YYYY”的情况下始终提取所需的字符串部分。

如果这是针对数据仓库环境中的DIMENSION表,并且您希望将它们作为单独的列包含在Dimension表中(作为数据属性),则需要将月份和年份存储在两个不同的列中,并且数据类型...

实施例..

Month varchar2(3) --Month code in Alpha..
Year  NUMBER      -- Year in number

or

Month number(2)    --Month Number in Year.
Year  NUMBER      -- Year in number

答案 2 :(得分:-1)

SELECT to_char(to_date(month,'yyyy-mm'),'Mon yyyy'), nos
FROM (SELECT to_char(credit_date,'yyyy-mm') MONTH,count(*) nos
      FROM HCN
      WHERE   TRUNC(CREDIT_dATE) BEtween '01-jul-2014' AND '30-JUN-2015'
      AND CATEGORYCODECFR=22
      --AND CREDIT_NOTE_NO IS NOT  NULL
      AND CANCELDATE IS NULL
GROUP BY to_char(credit_date,'yyyy-mm')
ORDER BY to_char(credit_date,'yyyy-mm') ) mm

输出:

Jul 2014        49
Aug 2014        35
Sep 2014        57
Oct 2014        50
Nov 2014        45
Dec 2014        88
Jan 2015       131
Feb 2015       112
Mar 2015        76
Apr 2015        45
May 2015        49
Jun 2015        40