Q]怎么获得今天是星期几,还关于其它日期函数用法 [A]可以用to_char来解决,如 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; 在获取之前可以设置日期语言,如 ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; 还可以在函数中指定 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual; 其它更多用法,可以参考to_char与to_date函数 如获得完整的时间格式 select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; 随便介绍几个其它函数的用法: 本月的天数 SELECT to_char(last_day(SYSDATE),'dd') days FROM dual 今年的天数 select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual 下个星期一的日期 SELECT Next_day(SYSDATE,'monday') FROM dual
[Q]随机抽取前N条记录的问题 [A] select * from (select a.* ,rownum t from tablename a order by sys_guid()) where t<N
[Q]抽取从N行到M行的记录,如从20行到30行的记录 [A]select * from (select rownum id,t.* from table t where …… and rownum <30) where id > 20;
[Q]怎么样抽取重复记录 [A]select * from table t1 where where t1.rowed != (select max(rowed) from table t2 where t1.id=t2.id and t1.name=t2.name) 或者 select count(*), t.col_a,t.col_b from table t group by col_a,col_b having count(*)>1 如果想删除重复记录,可以把第一个语句的select替换为delete
[Q]怎么样快速计算事务的时间与日志量 [A]可以采用类似如下的脚本 DECLARE start_time NUMBER; end_time NUMBER; start_redo_size NUMBER; end_redo_size NUMBER; BEGIN start_time := dbms_utility.get_time; SELECT VALUE INTO start_redo_size FROM v$mystat m,v$statname s WHERE m.STATISTIC#=s.STATISTIC# AND s.NAME='redo size'; --transaction start INSERT INTO t1 SELECT * FROM All_Objects; --other dml statement COMMIT; end_time := dbms_utility.get_time; SELECT VALUE INTO end_redo_size FROM v$mystat m,v$statname s WHERE m.STATISTIC#=s.STATISTIC# AND s.NAME='redo size'; dbms_output.put_line('Escape Time:'||to_char(end_time-start_time)||' centiseconds'); dbms_output.put_line('Redo Size:'||to_char(end_redo_size-start_redo_size)||' bytes'); END;