我有一个关于如何在Oracle SQL中比较YYYYMM的问题。 gradu_date以字符串格式保存,如'200212'。我想从2007年1月到2010年1月使用gradu_date查询行。
这是我的问题:
select ids,
from table
where to_date(substr(graduation_date,1,6),'YYYYMM' between 'Jan-2007'and 'Jan-2010'
我收到了错误
ORA-01858:找到数字所在的非数字字符 预期
任何人都可以帮忙解决这个问题吗?非常感谢!
我找到了比较的方法。由于gradu_date保存为vchar2格式,如'20021200'.Default值为'00000000'。只有年和年月份保存在Graduation_date中。这是我的查询: 选择ID, 从表 其中gradu_date介于'20070100'和'20100100'之间
我已经厌倦了其他一些方法,但得到了ORA-01843:没有有效的月份错误 选择ID, 从表 其中to_date(substr(gradu_date,1,6),'YYYYMM'介于'Jan-2007'和'Jan-2010'之间
谢谢你们,但只是想知道为什么我不能在这种情况下使用to_date进行比较?
答案 0 :(得分:0)
删除ids之后的逗号...在YYYYMM之后需要一个右括号,是char / varchar类型的gradu_date吗?如果没有,那么你不能做substr ...最后做to_date('200701','YYYYMM')和其他日期也... ...
答案 1 :(得分:0)
另外在此处删除逗号:select ids,
并在' YYYYMM'之后添加括号在这里:To_date(substr(graduation_date,1,6),'YYYYMM'
你还需要知道:
您将看到NLS设置中设置的格式的日期。即使在转换后你让你的NLS以已设置的格式显示,在你的情况下,它看起来像是MM / DD / YYYY,请查看:
SELECT VALUE FROM nls_session_parameters WHERE parameter = NLS_DATE_FORMAT';
如果您想以特殊格式选择date
,那么to_date
函数之后也会使用to_char
函数,例如(如果您的数据位于graduation_date
列中{ {1}}然后无需使用YYYYMM
函数,否则请按以下方式使用):
substr
因此,如果您要选择数据,请使用以下脚本(如果您的数据位于SELECT to_char (to_date (SUBSTR (graduation_date, 1, 6), 'YYYYMM'), 'YYYYMM') FROM table;
列graduation_date
中,则无需使用YYYYMM
功能,否则使用如下):
substr
我建议您使用SELECT ids
FROM table
WHERE to_date (SUBSTR (graduation_date, 1, 6), 'YYYYMM')
BETWEEN to_date ('200701', 'YYYYMM') AND to_date ('201001', 'YYYYMM');
'Jan-2012'
(即使您使用to_char
函数转换)BETWEEN
因为它会比较字母的字节,而不是月份,如果您使用这样的话,每年也可以获得June
或July
(仅Jan
的数据,而不是它们之间的所有月份):
WHERE to_char (to_date (SUBSTR (graduation_date, 1, 6), 'YYYYMM'), 'Mon-YYYY')
BETWEEN 'Jan-2007' AND 'Jan-2010';
结果是这样的:
Jan-2007
Jun-2007
Jul-2007
Jan-2010
...