SQL - 列有DATE,如何基于“日期”获取数据作为行中的值之一?

时间:2011-05-09 08:19:23

标签: sql oracle

我正在寻找一个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

2 个答案:

答案 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;