表RECORD_TABLE有两个字段:
RECORD_ID RECORD_CONTENT
------------- --------------------------------------------
7AGH3E48  2月份购买了一台电视机
46NS7CK6  三季度盖了一座新房子
167JKF06  2008年8月生了个胖宝宝
XJF83BG5  2009年12月又娶了个老婆
8DHN36SK  2010年一季度在家待岗
27FM389D  1995年5月
N8F86DN3  2012年会发生什么事情要实现的功能是:
针对RECORD_CONTENT字段中以完整的日期格式开头的记录(注:所谓完整,指的是xxxx年x月、xxxx年xx月以及xxxx年x季度等格式的,)
实现时间查询。sql的参数是201001或者201012这种格式,参数的数量为2,分别为查询条件的起始和截止时间。例如:当查询条件为:200810,201009时,将会有:
XJF83BG5  2009年12月又娶了个老婆
8DHN36SK  2010年一季度在家待岗
这两条记录展示出来。

解决方案 »

  1.   

    这个?估计就是把各种条件写在后面即可。例如:select * from tb where 
    (to_number(substr(RECORD_CONTENT,1,4)) between 1900 and 2100 and substr(RECORD_CONTENT,5,1) = '年' ....) or
    (又一个条件) or
    (又一个条件) ...
      

  2.   

    普通的sql查询,复杂的是判断并提取 RECORD_CONTENT字段中的值并转换成时间格式,和查询条件进行比较,返回结果
    只是小弟才疏学浅,只有一个不成熟的思路,而没有jurisdiction的解决方案
    静候高人前来指点一二!!!
      

  3.   

    难.你要确认你要比较的日期格式有哪些.
    然后根据格式产生两个伪字段,starttime和endtime,比如2010年一季度转换成 
    starttime=201001 endtime=201003,那么只要判断开始时间小于starttime,结束时间大于endtime,就可以把记录取出来.
      

  4.   

    xxxx年一季度、xxxx年二季度、xxxx年三季度、xxxx年四季度要分别转换成为:
    xxxx03、xxxx06、xxxx09、xxxx12这种格式。
      

  5.   

    写个很笨的sql
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
    Connected as tds
     
    SQL> select * from record_table;
     
    RECORD_ID                                                                        RECORD_CONTENT
    -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
    7AGH3E48                                                                         2月份购买了一台电视机
    46NS7CK6                                                                         三季度盖了一座新房子
    167JKF06                                                                         2008年8月生了个胖宝宝
    XJF83BG5                                                                         2009年12月又娶了个老婆
    8DHN36SK                                                                         2010年一季度在家待岗
    27FM389D                                                                         1995年5月
    N8F86DN3                                                                         2012年会发生什么事情
     
    7 rows selected
     
    SQL> select t.*
      2    from RECORD_TABLE t
      3   where translate(substr(t.record_content, 1, 4), '#1234567890', '#') is null
      4     and ((translate(substr(t.record_content,
      5                            6,
      6                            instr(t.record_content, '月') - 6),
      7                     '#1234567890',
      8                     '#') is null and
      9          length(substr(t.record_content,
     10                         6,
     11                         instr(t.record_content, '月') - 6)) > 0) or
     12          substr(t.record_content, 6, instr(t.record_content, '季度') - 6) in
     13          ('一', '二', '三', '四'))
     14     and substr(t.record_content, 1, 4) ||
     15         lpad(decode(substr(t.record_content,
     16                            6,
     17                            instr(t.record_content, '月') - 6) ||
     18                     substr(t.record_content,
     19                            6,
     20                            instr(t.record_content, '季度') - 6),
     21                     '一',
     22                     '01',
     23                     '二',
     24                     '04',
     25                     '三',
     26                     '07',
     27                     '四',
     28                     '10',
     29                     substr(t.record_content,
     30                            6,
     31                            instr(t.record_content, '月') - 6) ||
     32                     substr(t.record_content,
     33                            6,
     34                            instr(t.record_content, '季度') - 6)),
     35              2,
     36              '0') > '200810'
     37     and substr(t.record_content, 1, 4) ||
     38         lpad(decode(substr(t.record_content,
     39                            6,
     40                            instr(t.record_content, '月') - 6) ||
     41                     substr(t.record_content,
     42                            6,
     43                            instr(t.record_content, '季度') - 6),
     44                     '一',
     45                     '03',
     46                     '二',
     47                     '06',
     48                     '三',
     49                     '09',
     50                     '四',
     51                     '12',
     52                     substr(t.record_content,
     53                            6,
     54                            instr(t.record_content, '月') - 6) ||
     55                     substr(t.record_content,
     56                            6,
     57                            instr(t.record_content, '季度') - 6)),
     58              2,
     59              '0') < '201009';
     
    RECORD_ID                                                                        RECORD_CONTENT
    -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
    XJF83BG5                                                                         2009年12月又娶了个老婆
    8DHN36SK                                                                         2010年一季度在家待岗
     
    SQL> 
      

  6.   

    可能不完全合乎你的逻辑,你再改进改进吧.跟上面一样的,加了注释.
    select t.*
     from RECORD_TABLE t where translate(substr(t.record_content,1,4),'#1234567890','#') is null--前四位是数字
       and  ((translate (substr(t.record_content,6,instr(t.record_content,'月')-6),'#1234567890','#')is null and length(substr(t.record_content,6,instr(t.record_content,'月')-6))>0--判断月份格式的合法性) or
            substr(t.record_content,6,instr(t.record_content,'季度')-6) in ('一','二','三','四')--判断季度格式的合法性)        
     and substr(t.record_content,1,4)||lpad(decode(substr(t.record_content,6,instr(t.record_content,'月')-6)||substr(t.record_content,6,instr(t.record_content,'季度')-6),'一','01','二','04','三','07','四','10',substr(t.record_content,6,instr(t.record_content,'月')-6)||substr(t.record_content,6,instr(t.record_content,'季度')-6)),2,'0')>'200810'--取区间起始值
     and substr(t.record_content,1,4)||lpad(decode(substr(t.record_content,6,instr(t.record_content,'月')-6)||substr(t.record_content,6,instr(t.record_content,'季度')-6),'一','03','二','06','三','09','四','12',substr(t.record_content,6,instr(t.record_content,'月')-6)||substr(t.record_content,6,instr(t.record_content,'季度')-6)),2,'0')<'201009'--取区间结束值