我正在寻找一个SQL查询来从表中获取记录,以查找列值本身中存在的特定日期格式。
该列使用以下格式:
num: num1:num2:yyyy-mm-dd hh:mi:ss
示例值:
1928:52501:290c-1af6-44f2-8e3b-51ca4399
19282604:080:2901c-12-8b-51
997494:452:29a1c-1af-44-8e-51c99:2011-01-17 12:36:38
97494:452050:290c-1a-42-8b-51:2011-04-18 10:36:11
我们只需要获取包含日期的行:
997494:452:29a1c-1af-44-8e-51c99:2011-01-17 12:36:38
97494:452050:290c-1a-42-8b-51:2011-04-18 10:36:11
答案 0 :(得分:1)
SELECT *
FROM the_table
WHERE to_date(substr(refid, -19), 'yyyy-mm-dd HH24:MI:SS') = TIMESTAMP '2011-01-17 12:36:38'
当然,您不需要使用“真实”日期,只需使用
即可SELECT *
FROM the_table
WHERE substr(refid, -19) = '2011-01-17 12:36:38'
如果要查找最后具有有效日期模式的行(而不是此日期值“2011-01-17 12:36:38”),那么您需要定期表达式来检查它:
SELECT *
FROM the_table
WHERE regexp_like(refid, '([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})$')
请注意,这不会检查有效日期(它也会返回末尾带有“2011-02-31 40:50:60”的行)。
答案 1 :(得分:1)
看起来可能只是根据其中:
个字符的数量来区分带日期的行,例如:
SELECT * FROM the_table
WHERE INSTR(refid, ':', 1, 3) > 0;
您可以然后将日期转换为Oracle日期:
SELECT TO_DATE(SUBSTR(refid,INSTR(refid,':',1,3)+1)
,'yyyy-mm-dd hh24:mi:ss')
FROM the_table
WHERE INSTR(refid,':',1,3) > 0;
但是如果任何行具有无法转换为日期的值,则查询将失败。
要解决此问题,您可以创建一个测试值的函数,例如:
CREATE FUNCTION ref_date (refid IN VARCHAR2)
RETURN DATE IS
d DATE;
BEGIN
d := TO_DATE(SUBSTR(refid,INSTR(refid,':',1,3)+1)
,'yyyy-mm-dd hh24:mi:ss');
RETURN d;
EXCEPTION
WHEN VALUE_ERROR THEN
RETURN NULL;
END;
现在您可以按如下方式查询:
SELECT ref_date(refid)
FROM the_table
WHERE INSTR(refid,':',1,3) > 0
AND ref_date(refid) IS NOT NULL;