如何找到无效小时

时间:2017-01-30 09:09:36

标签: sql oracle

我正在尝试在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 ;; 你能帮忙吗?

1 个答案:

答案 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
相关问题