【问题标题】:SQL - column has DATE, how to fetch data based "date" as one of the values in rows?SQL - 列有日期,如何获取基于“日期”的数据作为行中的值之一?
【发布时间】:2011-05-10 09:16:45
【问题描述】:

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

【问题讨论】:

    标签: sql oracle


    【解决方案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”的行)。

    【讨论】:

    • 嗨......但它只会获取数据库中存在特定日期“2011-01-17 12:36:38”的结果。这些行可以更改为其他日期,例如“2011-04-18 10:36:11”、“2011-03-19 09:11:20”等...
    • @Ashish:你说 “我想获取日期值为“2011-01-17 12:36:38”的结果,这就是该语句正在执行的操作。如果您想根据不同的条件检索一系列日期或行,您需要提供更详细的信息。向我们展示一些真实的示例数据(多行)以及您期望的结果。
    • 好的,这里有一些列“refid”值(用逗号分隔):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.所以我只需要获取带有日期的值。所以我们 sql 会跳过第一个值,但会考虑最后两个。
    • 请编辑您的帖子,而不是在评论中发布。所以你想检索那些 refid 最后包含有效日期字符串的行?
    【解决方案2】:

    看起来带有日期的行可以简单地根据其中:字符的数量来区分,例如:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多