表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年一季度在家待岗
这两条记录展示出来。
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年一季度在家待岗
这两条记录展示出来。
(to_number(substr(RECORD_CONTENT,1,4)) between 1900 and 2100 and substr(RECORD_CONTENT,5,1) = '年' ....) or
(又一个条件) or
(又一个条件) ...
只是小弟才疏学浅,只有一个不成熟的思路,而没有jurisdiction的解决方案
静候高人前来指点一二!!!
然后根据格式产生两个伪字段,starttime和endtime,比如2010年一季度转换成
starttime=201001 endtime=201003,那么只要判断开始时间小于starttime,结束时间大于endtime,就可以把记录取出来.
xxxx03、xxxx06、xxxx09、xxxx12这种格式。
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>
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'--取区间结束值