Sql 如何查找无效工时
我正在尝试在OracleSQLDeveloper中构建一个查询,该查询将返回不在营业时间08:00am-5:00PM内的小时数,以便对其进行清理。 该列名为“拍卖时间”。问题在于,该表包含200万行和所有类型的格式,如“9:45 am”、“9 am”、“11:00:00”、“23:00”等。 我尝试过类似的smthing,但它也会返回其他类型的结果 从拍卖时间介于“17%”和“24%”之间的所有止赎中选择*; 您可以提供帮助吗?您可以使用一个CASE语句和多个正则表达式来匹配不同的格式。您需要识别所有不同的格式: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语句和多个正则表达式来匹配不同的格式。您需要识
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这听起来几乎是不可能做到的,因为列本身没有直接的格式……这也是为什么不应该将时间或日期存储为字符串的另一个证明!我要做的第一件事是确定所有可能的格式;一旦给出这一点,就更容易理解如何转换每个值,然后执行所需的检查。你能列出你的数据可能的格式吗?