[英]Oracle sql sort greater date first, based on 2 date column
我有一个包含 2 列 CREATION_DATE 和 CHANGE_DATE 的表。 我正在寻找一种基于更大日期对数据进行排序的方法。
可能是这样的:
select * from table order by compare(CREATION_DATE ,CHANGE_DATE) desc;
compare(CREATION_DATE,CHANGE_DATE) function 假设在两列之间返回更大的日期。
我进行了很多搜索,并尝试了各种日期 function 和 NULLS FIST,LAST 但不使用的组合。
任何帮助是极大的赞赏。
如果两个日期都不是NULL
,那么您可以使用:
order by greatest(creation_date, change_date) desc
不幸的是,如果任何值为NULL
, greatest()
返回NULL
。
如果change_date
是NULL
或大于creation_date
,那么您可以使用coalesce()
:
order by coalesce(change_date, creation_date)
这种情况对我来说很有意义——在创建之前更改某些东西是不寻常的。
如果change_date
可以是NULL
并且也可以小于creation_date
,那么你需要更加小心。 您需要用一个值替换。 据推测, creation_date
不会是NULL
并且您可以使用coalesce()
:
order by greatest(creation_date, coalesce(change_date, creation_date)) desc
或case
表达式:
order by (case when change_date > creation_date then change_date
else creation_date
end)
没有compare
,但是 - 使用greatest
的。
order by greatest(creation_date, change_date) desc
你是这个意思吗? 您可以通过 Boolean 表达式订购...
WITH
indata(comp,cr_dt,chg_dt) AS (
SELECT 'same' ,'2021-02-15', '2021-02-15' FROM dual
UNION ALL SELECT 'cr_bigger' ,'2021-02-16', '2021-02-15' FROM dual
UNION ALL SELECT 'chg_bigger','2021-02-15', '2021-02-16' FROM dual
UNION ALL SELECT 'cr_bigger' ,'2021-02-26', '2021-02-25' FROM dual
UNION ALL SELECT 'chg_bigger','2021-02-25', '2021-02-26' FROM dual
)
SELECT
CASE WHEN cr_dt > chg_dt
THEN 1
ELSE 0
END AS cr_is_greater
, comp
, cr_dt
, chg_dt
FROM indata
ORDER BY 1 DESC
;
cr_is_greater | comp | cr_dt | chg_dt
---------------+------------+------------+------------
1 | cr_bigger | 2021-02-16 | 2021-02-15
1 | cr_bigger | 2021-02-26 | 2021-02-25
0 | same | 2021-02-15 | 2021-02-15
0 | chg_bigger | 2021-02-15 | 2021-02-16
0 | chg_bigger | 2021-02-25 | 2021-02-26
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.