为什么以下查询成功运作?
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
答案 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')