我正在尝试在Oracle SQL Developer中构建一个查询,该查询将返回非工作时间(上午08:00 - 下午5:00)的小时数以便清理它。 该列名为auction_time。问题是该表包含200万行和其他类型的格式,例如< 9:45 am'' 9 am',' 11:00:00&#39 ;,' 23:00'还有一些。 我尝试了类似的东西,但它也返回其他类型的结果 从all_foreclosures中选择*,其中auction_time介于' 17%'和' 24%&#39 ;; 你能帮忙吗?
答案 0 :(得分:0)
您可以使用CASE
语句和多个正则表达式来匹配不同的格式(您需要识别所有不同的格式):
SELECT *
FROM (
SELECT t.*,
( CASE
WHEN REGEXP_LIKE( auction_time, '^\s*(0?[1-9]|1[0-2])\s*[ap]m\s*$', 'i' )
THEN TO_DATE( auction_time, 'HH12AM' )
WHEN REGEXP_LIKE( auction_time, '^\s*(0?[1-9]|1[0-2]):[0-5]?\d\s*[ap]m\s*$','i')
THEN TO_DATE( auction_time, 'HH12:MIAM' )
WHEN REGEXP_LIKE( auction_time, '^\s*([01]?\d|2[0-3]):[0-5]?\d\s*$' )
THEN TO_DATE( auction_time, 'HH24:MI' )
WHEN REGEXP_LIKE( auction_time, '^\s*([01]?\d|2[0-3]):[0-5]?\d:[0-5]?\d\s*$' )
THEN TO_DATE( auction_time, 'HH24:MI:SS' )
END
- TRUNC( SYSDATE, 'Y' )
) * 24 AS Hours
FROM your_table t
)
WHERE hours < 8 OR hours > 17