将YYYYMM与日期范围

时间:2017-08-04 16:48:40

标签: sql oracle

我有一个关于如何在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进行比较?

2 个答案:

答案 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'你还需要知道:

  1. 您将看到NLS设置中设置的格式的日期。即使在转换后你让你的NLS以已设置的格式显示,在你的情况下,它看起来像是MM / DD / YYYY,请查看:

    SELECT VALUE FROM nls_session_parameters WHERE parameter = NLS_DATE_FORMAT';

  2. 如果您想以特殊格式选择date,那么to_date函数之后也会使用to_char函数,例如(如果您的数据位于graduation_date列中{ {1}}然后无需使用YYYYMM函数,否则请按以下方式使用):

    substr

    1. 因此,如果您要选择数据,请使用以下脚本(如果您的数据位于SELECT to_char (to_date (SUBSTR (graduation_date, 1, 6), 'YYYYMM'), 'YYYYMM') FROM table;graduation_date中,则无需使用YYYYMM功能,否则使用如下):

      substr

    2. 我建议您使用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因为它会比较字母的字节,而不是月份,如果您使用这样的话,每年也可以获得JuneJuly(仅Jan的数据,而不是它们之间的所有月份):

    3. 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 ...