【问题标题】:Taking the Max date from three date columns从三个日期列中获取最大日期
【发布时间】:2020-02-05 20:54:19
【问题描述】:

我需要按 ID 获取三列的最大日期:创建日期、更新日期和交易日期。下面是我引用的数据的简化版本,并不代表我正在使用的实际数据。

+--------------------------------------------------------+
| ID |  Date Created   | Updated Date | Transaction Date |
+--------------------------------------------------------+
| 12 |   19-APR-19     |     NULL     |     20-APR-19    |
| 68 |   02-Nov-18     |   03-DEC-18  |     02-NOV-18    |
| 12 |   05-MAY-19     |   12-MAY-19  |     12-MAY-19    |
| 72 |   10-SEP-19     |   01-OCT-19  |     25-SEP-19    |
+--------------------------------------------------------+

在每个 ID 检索这些列的最大值后,我应该得到:

+---------------------+
| ID |      Date      | 
+---------------------+
| 68 |   03-DEC-18    |   
| 12 |   12-MAY-19    |     
| 72 |   01-OCT-19    |   
+---------------------+

到目前为止,我已经尝试了以下变体:

   CASE WHEN
      TO_CHAR(ud.updated_date,'MM/DD/YYYY') >= TO_CHAR(NVL(mqp.trans_effective_date,0),'MM/DD/YYYY') AND TO_CHAR(ud.updated_date,'MM/DD/YYYY') >= TO_CHAR(NVL(mt.date_created,0),'MM/DD/YYYY') THEN TO_CHAR(ud.updated_date,'MM/DD/YYYY')
      WHEN 
      TO_CHAR(mt.transaction_date,'MM/DD/YYYY') >= TO_CHAR(NVL(ud.updated_date,0),'MM/DD/YYYY') AND TO_CHAR(mt.transaction_date,'MM/DD/YYYY') >= TO_CHAR(NVL(mt.date_created,0),'MM/DD/YYYY') THEN TO_CHAR(mt.transaction_date,'MM/DD/YYYY')
      WHEN
      TO_CHAR(mt.date_created,'MM/DD/YYYY') >= TO_CHAR(NVL(ud.updated_date,0),'MM/DD/YYYY') AND TO_CHAR(mt.date_created,'MM/DD/YYYY') >= TO_CHAR(NVL(mt.transaction_date,0),'MM/DD/YYYY') THEN TO_CHAR(mt.date_created,'MM/DD/YYYY')
  END Date

但这以以下错误结束:

ORA-00932: inconsistent datatypes: expected NLS PARAMETER got DATE
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:

我也尝试了以下不同的变体:

  GREATEST(TO_CHAR(mt.date_created,ud.updated_date,mt.transaction_date), 'MM/DD/YYYY') Date

然后我得到这个错误:

ORA-00932: inconsistent datatypes: expected NLS PARAMETER got DATE
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action

任何建议将不胜感激!

【问题讨论】:

    标签: sql oracle greatest-n-per-group


    【解决方案1】:

    使用greatest():

    select id, greatest(updated_date, mqp.trans_effective_date, mt.date_created)
    from . . .
    

    假设所有类型都是date(正如您的问题所暗示的那样),您应该没有转换问题。

    如果您在多行上有 id,则使用聚合:

    select id, greatest(max(updated_date), max(mqp.trans_effective_date), max(mt.date_created))
    from . . .
    

    【讨论】:

    • :) 谢谢你们!我能够通过取消转换来简化。
    • 嗨@forpas,确实如此。这是一个更大的查询的一部分。我还对照其他报告结果对其进行了检查,结果是匹配的。谢谢你的提问。
    • @forpas,正如我上面提到的,“下面是我引用的数据的简化版本,并不代表我正在使用的实际数据。”以上回答了我的问题,不仅采用了我需要的最大值,而且还通过取出“TO_CHAR”函数简化了我使用的选择。这导致我收到错误,我在上面也说过。我希望这能更好地说明我接受这个特定答案的原因。
    【解决方案2】:

    如果您按 id 分组,您需要 3 个日期中最大的一个:

    SELECT ID, 
      TO_CHAR(MAX(GREATEST("date_created", "updated_date", "transaction_date")),'MM/DD/YYYY') "Date"
    FROM tablename
    GROUP BY ID
    

    请参阅demo
    结果:

    > ID | Date      
    > -: | :---------
    > 72 | 10/01/2019
    > 68 | 12/03/2018
    > 12 | 05/12/2019
    

    【讨论】:

      【解决方案3】:

      你已经尝试了正确的事情,只需要简单的改变(先取最大的日期,然后使用TO_CHAR将其转换为字符):

      TO_CHAR(GREATEST(mt.date_created,ud.updated_date,mt.transaction_date), 'MM/DD/YYYY') as your_Date
      

      干杯!!

      【讨论】:

        猜你喜欢
        • 2014-07-14
        • 2019-02-03
        • 2017-11-04
        • 1970-01-01
        • 2022-10-13
        • 2016-07-04
        • 2018-03-12
        • 2020-03-02
        • 1970-01-01
        相关资源
        最近更新 更多