从oracle中的日期提取月份和年份

时间:2017-09-07 11:27:26

标签: sql oracle

从完整日期开始提取月份和年份的查询是什么。 我的数据是这样的:1/29/2008 我试过这个问题:

select ID_NO, CHECKED_DATE, to_date(TO_CHAR(CHECKED_DATE, 'MON-YYYY'), 'MON-YYYY') AS A 
from Doctor_Checkup;

但它会提供输出:1/1/2008

预期产出:1-2008

5 个答案:

答案 0 :(得分:5)

日期没有格式 - 它是stored internally to the database 7字节(代表年,月,日,小时,分钟和秒),直到您使用的是任何用户界面(即SQL) /另外,SQL Developer,Java等)尝试将它显示给您,即用户,并将其转换为您认为有效的(通常是字符串)日期具有格式的内容。

需要注意的一点是,日期始终包含年,月,日,小时,分钟和秒组件。这样做的:

to_date(TO_CHAR(CHECKED_DATE, 'MON-YYYY'), 'MON-YYYY')

实际上和做的一样:

TRUNC( Checked_Date, 'MM' )

并且仍然会有一天,一小时,一分钟和二分组,但会被截断到该月第一天的午夜。用户界面可能只是将其首选项设置为不显示时间组件(但日期仍然有一个)。

您要做的是将日期转换为格式化字符串:

select ID_NO,
       CHECKED_DATE,
       TRIM( LEADING '0' FROM TO_CHAR( CHECKED_DATE, 'MM-YYYY') ) AS A 
from   Doctor_Checkup;

select ID_NO,
       CHECKED_DATE,
       EXTRACT( MONTH FROM CHECKED_DATE )
         || '-' || EXTRACT( YEAR FROM CHECKED_DATE ) AS A 
from   Doctor_Checkup;

答案 1 :(得分:4)

如果该字段已经是日期列,您只需将其转换为您想要的格式:

select ID_NO,CHECKED_DATE,ltrim(TO_CHAR(CHECKED_DATE,'mm-yyyy'),'0') AS A from Doctor_Checkup;

如果是文本列,则需要首先使用格式转换为日期:

select ID_NO,CHECKED_DATE,ltrim(TO_CHAR(TO_DATE(CHECKED_DATE,'dd/mm/yyyy'),'mm-yyyy'),'0') AS A from Doctor_Checkup;

答案 2 :(得分:1)

要获得1-2008格式,请使用以下格式修剪前导零:

select ID_NO,CHECKED_DATE,ltrim(TO_CHAR(CHECKED_DATE,'MM-YYYY'),'0') AS A from Doctor_Checkup; 

答案 3 :(得分:1)

您想要一个表示月份和年份的字符串,格式为[M] M-YYYY。但是,Oracle public static void Put(string key, object value) { int insertionIndex = -1; for (int i = 0; i < pArr.Length; i++) { if (pArr[i] != null) { if (pArr[i].Key == key) { insertionIndex = i; break; } } else if (insertionIndex < 0) { insertionIndex = i; } } if (insertionIndex < 0) { throw new Exception("All slots full"); } else { pArr[insertionIndex] = new Paar(key, value); } } 仅支持MM-YYYY,所以你必须摆脱前导零(如果有的话)。

两种解决方案:

TO_CHAR

trim(leading '0' from to_char(checked_date, 'mm-yyyy'))

答案 4 :(得分:0)

从(6)中选择DOCTOR_CHECKUP EXTRACT中的CHECKED_DATE(从CHECKED_DATE起的月份)和(2019年中)提取(从CHECKED_DATE起的年份);

6个月,2019年是一年