oracle中文时间,oracle - Oracle日期和时间提示 - SO中文参考 - www.soinside.com

如@Wernfried所说,10g有点过时了。所以呢?我也使用它(对于某些应用程序)。由于您无法更改它,因此,我们尝试找到一种使其变得更快的方法。看看这个选项,看看是否有帮助。

模仿“您的表”的样本表,作为Scott的EMP表的副本。索引date列(如果有的话):SQL> create table your_table as select * From emp;

Table created.

SQL> create index i1 on your_table (hiredate);

Index created.

SQL> alter session set nls_date_Format = 'dd.mm.yyyy';

Session altered.

SQL> select empno, ename, hiredate from your_table order by hiredate desc;

EMPNO ENAME HIREDATE

---------- ---------- ----------

7876 ADAMS 12.01.1983

7788 SCOTT 09.12.1982

7934 MILLER 23.01.1982

7902 FORD 03.12.1981

7900 JAMES 03.12.1981

7839 KING 17.11.1981

7654 MARTIN 28.09.1981

7844 TURNER 08.09.1981

7782 CLARK 09.06.1981

7698 BLAKE 01.05.1981

7566 JONES 02.04.1981

7521 WARD 22.02.1981

7499 ALLEN 20.02.1981

7369 SMITH 17.12.1980

14 rows selected.

SQL>

现在,idea本身:创建一个仅包含一行的新表-hiredate,当前在表中为MAX:SQL> create table maxdat (maxdat date);

Table created.

SQL> -- Initial insert

SQL> insert into maxdat (maxdat) select max(hiredate) from your_table;

1 row created.

SQL> select * From maxdat;

MAXDAT

----------

12.01.1983

SQL>

为了维护maxdat表,创建一个数据库触发器-如果表中新添加(或更新)的MAXDAT大于hiredate,它将替换当前的MAXDAT列值:SQL> create or replace trigger trg_aiu_yourt

2 after insert or update on your_table

3 for each row

4 declare

5 l_maxdat maxdat.maxdat%type;

6 begin

7 merge into maxdat m

8 using (select :new.hiredate as hiredate from dual) x

9 on (1 = 1)

10 when matched then update set

11 m.maxdat = x.hiredate

12 where x.hiredate > m.maxdat;

13 end;

14 /

Trigger created.

SQL> select * from maxdat;

MAXDAT

----------

12.01.1983

SQL>

让我们强制MAXDAT更改(现在,员工FORD将具有最高的hiredate列值:]SQL> update your_table set hiredate = date '1984-01-01' where ename = 'FORD';

1 row updated.

SQL> select * From maxdat;

MAXDAT

----------

01.01.1984

SQL>

最后,您的查询现在不必扫描整个巨大的表(实际上是索引),而是一个单行表:maxdat:SQL> select y.empno, y.ename, y.job, y.sal, y.hiredate

2 from your_table y cross join maxdat m

3 where y.hiredate = m.maxdat;

EMPNO ENAME JOB SAL HIREDATE

---------- ---------- --------- ---------- ----------

7902 FORD ANALYST 3000 01.01.1984

SQL>

由于hiredate列已建立索引,并且您知道maxdat值,所以此可能相当快。

可能的缺点:如果your_table中有大量并发插入/更新,触发器可能会减慢速度,但是-没有免费的午餐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值