Sql 如何查找无效工时

Sql 如何查找无效工时,sql,oracle,Sql,Oracle,我正在尝试在OracleSQLDeveloper中构建一个查询,该查询将返回不在营业时间08:00am-5:00PM内的小时数,以便对其进行清理。 该列名为“拍卖时间”。问题在于,该表包含200万行和所有类型的格式,如“9:45 am”、“9 am”、“11:00:00”、“23:00”等。 我尝试过类似的smthing,但它也会返回其他类型的结果 从拍卖时间介于“17%”和“24%”之间的所有止赎中选择*; 您可以提供帮助吗?您可以使用一个CASE语句和多个正则表达式来匹配不同的格式。您需要识

我正在尝试在OracleSQLDeveloper中构建一个查询,该查询将返回不在营业时间08:00am-5:00PM内的小时数,以便对其进行清理。 该列名为“拍卖时间”。问题在于,该表包含200万行和所有类型的格式,如“9:45 am”、“9 am”、“11:00:00”、“23:00”等。 我尝试过类似的smthing,但它也会返回其他类型的结果 从拍卖时间介于“17%”和“24%”之间的所有止赎中选择*; 您可以提供帮助吗?

您可以使用一个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

场地的布局是什么?nvarchar、datetime、varchar……?VARCHAR216 BYTEU这听起来几乎是不可能做到的,因为列本身没有直接的格式……这也是为什么不应该将时间或日期存储为字符串的另一个证明!我要做的第一件事是确定所有可能的格式;一旦给出这一点,就更容易理解如何转换每个值,然后执行所需的检查。你能列出你的数据可能的格式吗?