ODPS 不同格式的日期比較大小

2021-10-01 05:43:25 字數 3195 閱讀 6940

思路:sql實現,正規表示式匹配到不同格式然後將其轉為同一種格式的日期時間進行比較

例如:將所有的日期格式轉換為yyyyddmmhhmmsss的格式

這裡是在odps的寫的例項,用到正則匹配和正則替換

#取最小值

select distinct tmp1.birthday,tmp1.real_birthday from (select regexp_replace(tmp.birthday, "[-|/|.|\\s|:|年|月|日]", "\\1", 0) as birthday,real_birthday from

(select case when birthday rlike '^(((18|19|([23]\\d))\\d)[-|/|\\.][1-9][-|/|\\.]([1-2][1-9])|10|20|30|31)$'

then regexp_replace(birthday, '[-|/|\\.|年]', '-0', 1)

when birthday rlike '^(((18|19|([23]\\d))\\d)[-|/|\\.|年](10|11|12)[-|/|\\.|月][1-9])$'

then regexp_replace(birthday, '[-|/|\\.|月]', '-0', 2)

when birthday rlike '^(((18|19|([23]\\d))\\d)[-|/|\\.|年][1-9][-|/|\\.|月][1-9]日)$'

then regexp_replace(birthday, '[-|/|\\.|年|月]', '-0', 0)

when birthday rlike '^((0[1-9]|(10|11|12))[-|/|\\.](([0-2][1-9])|10|20|30|31)[-|/|\\.]((18|19|([23]\\d))\\d))$'

then concat(regexp_replace(birthday, '(0[1-9]|(10|11|12))[-|/|\\.](([0-2][1-9])|10|20|30|31)[-|/|\\.]', '', 0),

regexp_replace(birthday, '[-|/|\\.]((18|19|([23]\\d))\\d)', '', 0))

else birthday

end as birthday,birthday as real_birthday

from t_status

where birthday rlike '^(((18|19|([23]\\d))\\d)[-|/|年]((0[1-9])|(10|11|12))[-|/|月](([0-2][1-9])|10|20|30|31)[日]\\s*(\\s+(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d(\\.\\d)))$') tmp

) tmp1 order by tmp1.birthday limit 1;

#取最大值

select tmp1.birthday,tmp1.real_birthday from (select regexp_replace(tmp.birthday, "[-|/|.|\\s|:|年|月|日]", "\\1", 0) as birthday,real_birthday from

(select case when birthday rlike '^(((18|19|([23]\\d))\\d)[-|/|\\.][1-9][-|/|\\.]([1-2][1-9])|10|20|30|31)$'

then regexp_replace(birthday, '[-|/|\\.|年]', '-0', 1)

when birthday rlike '^(((18|19|([23]\\d))\\d)[-|/|\\.|年](10|11|12)[-|/|\\.|月][1-9])$'

then regexp_replace(birthday, '[-|/|\\.|月]', '-0', 2)

when birthday rlike '^(((18|19|([23]\\d))\\d)[-|/|\\.|年][1-9][-|/|\\.|月][1-9]日)$'

then regexp_replace(birthday, '[-|/|\\.|年|月]', '-0', 0)

when birthday rlike '^((0[1-9]|(10|11|12))[-|/|\\.](([0-2][1-9])|10|20|30|31)[-|/|\\.]((18|19|([23]\\d))\\d))$'

then concat(regexp_replace(birthday, '(0[1-9]|(10|11|12))[-|/|\\.](([0-2][1-9])|10|20|30|31)[-|/|\\.]', '', 0),

regexp_replace(birthday, '[-|/|\\.]((18|19|([23]\\d))\\d)', '', 0))

else birthday

end as birthday,birthday as real_birthday

from t_status

where birthday rlike '^(((18|19|([23]\\d))\\d)[-|/|年]((0[1-9])|(10|11|12))[-|/|月](([0-2][1-9])|10|20|30|31)[日]\\s*(\\s+(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d(\\.\\d)))$') tmp

) tmp1 order by tmp1.birthday desc limit 1;

) tmp1  order by tmp1.birthday desc limit 1;

可以處理的日期格式:

2019-06-09

2019-6-9

2019/06/09

2019/6/9

06/09/2019

6/9/2019

06-09-2019

20190609

2019.06.09

2019.6.9

2023年6月9日

2019-06-09 20:00:01

2019/06/09 20:00:01

2019.06.09 20:00:01

06-09-2019 10:50:24

20190609200001

格林威治時間目前木有做匹配;

若同時取最小值和最大值,目前思路是可以使用開窗函式實現,取第乙個值和最後乙個值;

python不同格式日期和系統時間的比較

import time def compare date time get 用於直接比較網頁日期與當前系統日期 time get 你需要用來與當前系統日期來比較的日期,可能來自於網頁爬蟲之類的 可以是中文格式 20年12月24日 stp time.strftime y m d stp list re...

pandas 日期比較大小 Pandas日期功能

日期功能擴充套件了時間序列,在財務資料分析中起主要作用。在處理日期資料的同時,我們經常會遇到以下情況 生成日期序列 將日期序列轉換為不同的頻率 建立乙個日期範圍 通過指定週期和頻率,使用date.range 函式就可以建立日期序列。預設情況下,範圍的頻率是天。參考以下示例 import pandas...

使用getdate 獲取不同格式的日期

在使用sql server查詢資料庫時,我們經常會需要查詢日期格式的資料,對於日期在sql語言中的格式有一定的要求,通過修改convert中的最後一位引數,可以返回不通格式的時間,具體實現如下 select convert varchar 45 getdate 0 08 24 2018 08 22a...