【问题标题】:Need the latest date from 2 columns in Oracle需要 Oracle 中 2 列的最新日期
【发布时间】:2017-03-01 02:25:55
【问题描述】:

作为我项目的一部分,我需要在 oracle 表的第三列中显示两列的最新日期。如果日期相同,则应根据时间显示最新。请帮我。提前致谢。

例如1:

col1                 col2                col3
12-FEB-17 03:24:23   15-FEB-17 08:12:52  15-FEB-17 08:12:52

它应该在 col3 中显示 col2 数据,因为它比 col1 晚了 3 天。

例如2:

col1                col2               col3
02-FEB-17 03:01:57  02-FEB-17 03:01:59 02-FEB-17 03:01:59

它应该在 col3 中显示 col2 数据,因为它比 col1 晚 2 秒。

【问题讨论】:

    标签: database oracle oracle11g oracle10g oracle-sqldeveloper


    【解决方案1】:

    您可以简单地使用 GREATEST() 函数。例如:

    with test as
    ( select to_date( '12-FEB-2017 03:24:23','DD-MON-YYYY HH24:MI:SS' ) col1,
             to_date( '15-FEB-2017 08:12:52','DD-MON-YYYY HH24:MI:SS' ) col2 from dual union all
      select to_date( '02-FEB-2017 03:01:57','DD-MON-YYYY HH24:MI:SS' ) ,
             to_date( '02-FEB-2017 03:01:59','DD-MON-YYYY HH24:MI:SS' ) from dual 
    )
    select col1, col2, greatest( col1, col2 ) col3
    from test
    
    
    COL1                 COL2                 COL3
    -------------------- -------------------- --------------------
    12-FEB-2017 03:24:23 15-FEB-2017 08:12:52 15-FEB-2017 08:12:52
    02-FEB-2017 03:01:57 02-FEB-2017 03:01:59 02-FEB-2017 03:01:59
    

    【讨论】:

    • 谢谢鲍勃。这行得通。我之前在使用 to_date 函数时犯了错误。现在它是完美的。非常感谢..
    • Here 你会发现有人回答你时该怎么做。
    【解决方案2】:

    使用greatest,但使用NVL。如果没有 NVL,如果您有 nulls,那么 null 将是 greatest 的输出

    select col1,col2,
    greatest(
        nvl(col1,to_date('1901-01-01','YYYY-MM-DD')),
        nvl(col2,to_date('1901-01-01','YYYY-MM-DD'))
            ) as col3
    from your_table;
    

    【讨论】:

      【解决方案3】:

      我真的不喜欢使用编造的日期,因为如果两者都为空怎么办?你会得到 1901-01-01。更好的是,使用 COALESCE 返回非空值:

      WITH your_table
           AS (SELECT 'COL1 Greater' test, SYSDATE col1, SYSDATE - 10 col2
                 FROM DUAL
               UNION ALL
               SELECT 'COL2 Greater', SYSDATE col1, SYSDATE + 10 col2
                 FROM DUAL
               UNION ALL
               SELECT 'COL1 null', NULL, SYSDATE col2
                 FROM DUAL
               UNION ALL
               SELECT 'Both null', NULL, NULL
                 FROM DUAL)
      SELECT test
           , TO_CHAR (col1, 'YYYY.MM.DD') col1
           , TO_CHAR (col2, 'YYYY.MM.DD') col2
           , TO_CHAR (GREATEST (COALESCE (col1, col2), COALESCE (col2, col1)), 'YYYY.MM.DD') AS col3
        FROM your_table;
      
      
      TEST         COL1       COL2       COL3      
      ------------ ---------- ---------- ----------
      COL1 Greater 2017.03.01 2017.02.19 2017.03.01
      COL2 Greater 2017.03.01 2017.03.11 2017.03.11
      COL1 null               2017.03.01 2017.03.01
      Both null                                    
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-23
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多