2017-04-18 37 views
2

我选择使用union三个表的一些数据,那么我想按日期和时间戳对它们进行排序(递减):预言:按日期排序和时间戳

select reportname as name, convert_to_char(a.date) AS created, 
.... 
from table1 

UNION 
select reportname as name, convert_to_char(a.date) AS created, 
.... 
from table2 

UNION 
select reportname as name, convert_to_char(a.date) AS created, 
.... 
from table3 

order by created desc; 

convert_to_char实现如下:

create or replace function convert_to_char(myDate date) 
RETURN varchar IS 
BEGIN 
return TO_CHAR(cast (myDate as timestamp) at local, 'YYYY-MM-DD HH24:MI:SS TZH:TZM'); 
END; 

排序的数据我得到的结果是这样的:

created 
------------------ 
2017-04-12 16:07:07 +02:00 
2017-04-13 09:00:01 +02:00 
2017-04-13 09:00:40 +02:00 
2017-04-12 16:06:17 +02:00 
2017-04-12 16:08:37 +02:00 
2017-04-12 16:07:31 +02:00 
2017-04-13 09:00:25 +02:00 
2017-04-13 09:00:25 +02:00 
2017-04-12 16:09:07 +02:00 
2017-04-12 16:08:20 +02:00 
2017-04-12 16:08:06 +02:00 
2017-04-12 16:06:48 +02:00 

但我期待以下排序结果:

created 
------------------ 
2017-04-13 09:00:40 +02:00 
2017-04-13 09:00:25 +02:00 
2017-04-13 09:00:25 +02:00 
2017-04-13 09:00:01 +02:00 
2017-04-12 16:09:07 +02:00 
2017-04-12 16:08:37 +02:00 
2017-04-12 16:08:20 +02:00 
2017-04-12 16:08:06 +02:00 
2017-04-12 16:07:31 +02:00 
2017-04-12 16:07:07 +02:00 
2017-04-12 16:06:48 +02:00 
2017-04-12 16:06:17 +02:00 

任何想法如何获得预期的排序结果?

谢谢你提前。

+1

'sort by'?在Oracle中? –

+0

为什么不使用'ORDER BY a.date' –

+0

我已经更新为“order by”。排序依据是错字 –

回答

3

可以先对它们进行排序,然后选择

select name, created 
from 
(select reportname as name, convert_to_char(a.date) AS created, a.date, 
.... 
from table1 

UNION 
select reportname as name, convert_to_char(a.date) AS created, a.date 
.... 
from table2 

UNION 
select reportname as name, convert_to_char(a.date) AS created, a.date 
.... 
from table3 
order by a.date desc); 
3

尝试:

select name, convert_to_char(created) from (
    select reportname as name, date AS created, 
    .... 
    from table1 

    UNION 
    select reportname as name, date AS created, 
    .... 
    from table2 

    UNION 
    select reportname as name, date AS created, 
    .... 
    from table3 
) t 
order by created desc; 
0

首先,你对UNION查询语法是错误的。您只能在第一个SELECT上创建别名。 UNION版本都只是选择具有相同数据类型的字段。

其次,通过在子查询中进行联合,您可以直接从中选择,它会顺序很好。

WITH TotalTable AS (
    select reportname as name, convert_to_char(a.date) AS created, 
    .... 
    from table1 
    UNION 
    select reportname, convert_to_char(a.date), 
    .... 
    from table2 
    UNION 
    select reportname, convert_to_char(a.date), 
    .... 
    from table3) 
SELECT reportname, created FROM TotalTable 
ORDER BY created DESC