在oracle中提取月份和年份

时间:2017-07-28 05:59:35

标签: oracle to-char

为什么以下查询成功运作?

select to_char(sysdate,'MM-YYYY') from dual;

但是以下查询会出现invalid number错误:

select to_char('28-JUL-17','MM-YYYY') from dual;
select  to_char('7/28/2017','MM-YYYY') from dual;

但是,下面的查询会为您提供相同的日期格式。

select sysdate from dual; -- 7/28/2017 11:29:01 AM

5 个答案:

答案 0 :(得分:1)

因为函数TO_CHAR()接受日期或时间戳值。但是,'28-JUL-17''7/28/2017'都不是日期或时间戳 - 它们是 STRINGS

Oracle轻轻地尝试将这些stings转换为DATE值。这种隐式转换可能有效或可能失败,这取决于您当前的会话NLS_DATE_FORMAT,而不是。 NLS_TIMESTAMP_FORMAT设置。

正如在其他答案中已经给出的那样,你必须明确地转换字符串:

TO_DATE('28-JUL-17', 'DD-MON-RR')
TO_DATE('7/28/2017', 'MM/DD/YYYY')

答案 1 :(得分:0)

to_char()并不期望您以char值开头。如果你真的希望它能够工作,你需要将它包裹在to_date()函数中。

to_char(
  to_date(
    '28-JUL-17'
    , 'DD-Mon-YY'
   )
  ,'MM-YYYY'
)

答案 2 :(得分:0)

TO_CHAR功能仅接受日期或数字。也许你可以试试这个

select to_char(to_date('28-JUL-17', 'DD-MON-YY'),'MM-YYYY') from dual;

答案 3 :(得分:0)

您使用的掩码不正确,有关详细信息,请阅读here

正确的应该是:

select to_char(to_date('28-JUL-17','DD-MON-YY'), 'MON-YY') from dual;

您还可以使用EXTRACT提取月份:

select EXTRACT (MONTH FROM to_date('28-JUL-17','DD-MON-YY')) from dual;

干杯

答案 4 :(得分:0)

作为旁注,如果您计划将一堆日期转换为字符串,以便在特定年份的某个月内查找所有记录,请注意TRUNC函数可用于降低精度日期(例如“月和年”)。以下查询从表中提取本月创建的所有记录。它应该比将日期转换为char并进行字符串比较更快。

SELECT * FROM table WHERE trunc(create_date, 'MON') = trunc(sysdate, 'MON')