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

vij*_*aya 5 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;
Run Code Online (Sandbox Code Playgroud)

但它会给出输出:1/1/2008

预期产量:1-2008

Tho*_*ner 7

您需要一个表示月份和年份的字符串,格式为 [M]M-YYYY。不过,OracleTO_CHAR仅支持 MM-YYYY,因此您必须删除前导零(如果有)。

两种解决方案:

trim(leading '0' from to_char(checked_date, 'mm-yyyy'))
Run Code Online (Sandbox Code Playgroud)

或者

extract(month from checked_date) || '-' || extract(year from checked_date) from dual
Run Code Online (Sandbox Code Playgroud)


Wil*_*son 6

如果该字段已经是日期列,则可以将其强制转换为所需的格式:

select ID_NO,CHECKED_DATE,ltrim(TO_CHAR(CHECKED_DATE,'mm-yyyy'),'0') AS A from Doctor_Checkup;
Run Code Online (Sandbox Code Playgroud)

如果它是文本列,则需要将其强制转换为第一个格式的日期:

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


MT0*_*MT0 6

日期没有格式 - 它以7字节(代表年,月,日,小时,分钟和秒)的内部存储在数据库中,直到您使用的是任何用户界面(即SQL/Plus, SQL Developer,Java等尝试将它显示给您,即用户,并将其转换为您认为有效的(通常是字符串)日期具有格式的内容.

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

to_date(TO_CHAR(CHECKED_DATE, 'MON-YYYY'), 'MON-YYYY')
Run Code Online (Sandbox Code Playgroud)

实际上与做的有效:

TRUNC( Checked_Date, 'MM' )
Run Code Online (Sandbox Code Playgroud)

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

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

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

要么

select ID_NO,
       CHECKED_DATE,
       EXTRACT( MONTH FROM CHECKED_DATE )
         || '-' || EXTRACT( YEAR FROM CHECKED_DATE ) AS A 
from   Doctor_Checkup;
Run Code Online (Sandbox Code Playgroud)