|
# 2
--严格的判断了日期有效性
SQL> with function f_date (p_str in varchar2)
2 return int
3 is
4 l_date date;
5 begin
6 l_date := to_date(p_str,'ddmmyy');
7 return 1;
8 exception when others then
9 return 0;
10 end;
11 t_dd as (select dd,power(2,substr(dd,1,1)) d1_v,power(2,substr(dd,2,1)) d2_v
12 from (select lpad(level,2,'0') dd from dual connect by level <=31)
13 where substr(dd,1,1) <> substr(dd,2,1)),
14 t_mm as (select mm,power(2,substr(mm,1,1)) m1_v,power(2,substr(mm,2,1)) m2_v
15 from (select lpad(level,2,'0') mm from dual connect by level <=12)
16 where substr(mm,1,1) <> substr(mm,2,1)),
17 t_yy as (select yy,power(2,substr(yy,1,1)) y1_v,power(2,substr(yy,2,1)) y2_v
18 from (select lpad(level,2,'0') yy from dual connect by level <=99)
19 where substr(yy,1,1)<> substr(yy,2,1)),
20 t_hh as (select hh,power(2,substr(hh,1,1)) h1_v,power(2,substr(hh,2,1)) h2_v
21 from (select lpad(level,2,'0') hh from dual connect by level <=23)
22 where substr(hh,1,1) <> substr(hh,2,1)),
23 t_mi as (select mi,power(2,substr(mi,1,1)) i1_v,power(2,substr(mi,2,1)) i2_v
24 from (select lpad(level,2,'0') mi from dual connect by level <=59)
25 where substr(mi,1,1)<> substr(mi,2,1))
26 select min(to_number(dd||mm||yy||hh||mi)) min_num,max(to_number(dd||mm||yy||hh||mi)) max_num,
27 max(to_number(dd||mm||yy||hh||mi)) - min(to_number(dd||mm||yy||hh||mi)) diff_num
28 from t_dd,t_mm,t_yy,t_hh,t_mi
29 where d1_v + d2_v + m1_v + m2_v + y1_v + y2_v + h1_v + h2_v + i1_v + i2_v = power(2,10)-1
30 and f_date(dd||mm||yy) = 1;
31 /
MIN_NUM MAX_NUM DIFF_NUM
---------- ---------- ----------
1406782359 2908761543 1501979184
|
|