我想只在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答案 0 :(得分:18)
最简单的解决方案是使用正确的数据类型创建列:DATE
例如:
创建表格:
创建表test_date(mydate date);
插入行:
插入test_date值(to_date('01 -01-2011','dd-mm-yyyy'));
要获得月份和年份,请执行以下操作:
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