代码之家  ›  专栏  ›  技术社区  ›  Scott Baker

SQL-从多个列中获取最新日期

sql
  •  6
  • Scott Baker  · 技术社区  · 14 年前

    假定包含以下内容的行集

    EntryID    Name      DateModified   DateDeleted
    -----------------------------------------------  
    1          Name1     1/2/2003       NULL
    2          Name1     1/3/2005       1/5/2008
    3          Name1     1/3/2006       NULL
    4          Name1     NULL           NULL  
    5          Name1     3/5/2008       NULL
    

    澄清:

    我需要一个值-两列中最大的非空日期。所以这十个细胞中最大的一个。

    6 回复  |  直到 14 年前
        1
  •  7
  •   Martin Smith    14 年前
    SELECT MAX(CASE WHEN (DateDeleted IS NULL OR DateModified > DateDeleted)
                    THEN DateModified ELSE DateDeleted END) AS MaxDate
    FROM Table
    
        2
  •  6
  •   OMG Ponies    14 年前

    对于mysql、postgres或oracle,使用最大的函数:

    SELECT GREATEST(ISNULL(t.datemodified, '1900-01-01 00:00:00'),  
                    ISNULL(t.datedeleted, '1900-01-01 00:00:00'))
      FROM TABLE t
    

    如果提供了空值,Oracle和MySQL都将返回空值。该示例使用mysql空处理-相应地更新相应的数据库。

    数据库不可知的替代方法是:

    SELECT z.entryid,
           MAX(z.dt)
      FROM (SELECT x.entryid,
                   x.datemodified AS dt
              FROM TABLE x
            UNION ALL
            SELECT y.entryid
                   y.datedeleted AS dt
              FROM TABLE y) z
    GROUP BY z.entryid
    
        3
  •  2
  •   FrustratedWithFormsDesigner    14 年前

    作为一般的解决方案,您可以尝试以下方法:

    select max(date_col)
    from(
      select max(date_col1) AS date_col from some_table
      union
      select max(date_col2) AS date_col from some_table
      union
      select max(date_col3) AS date_col from some_table
      ...
    )
    

    可能有更简单的方法,这取决于您使用的数据库。

        4
  •  2
  •   Alex K.    14 年前

    怎么样;

    SELECT MAX(MX) FROM (
        SELECT MAX(DateModified) AS MX FROM Tbl
        UNION
        SELECT MAX(DateDeleted) FROM Tbl
    ) T
    
        5
  •  1
  •   Thomas    14 年前

    答案取决于你真正想要什么。如果只需要两个日期值中的最新值,则可以执行以下操作:

    Select Max(DateModified), Max(DateDeleted)
    From Table
    

    如果你想从 任一列 ,然后您可以简单地执行以下操作:

    Select Case 
            When Max(DateModified) > Max(DateDeleted) Then Max(DateModified)
            Else Max(DateDeleted)
            End As MaxOfEitherValue
    From Table
    
        6
  •  1
  •   Darknight    14 年前

    以上均为有效答案;

    但我不确定这是否可行?

    select IsNull((
                    select MAX(DateModified) 
                    from table
                  )
                 ,
                  (
                     select MAX(DateDeleted) 
                     from table
                  )
                 )     as MaxOfEitherValue
    from    table 
    

    编辑1:

    今天早上洗澡的时候,我有另一个解决办法:

    解决方案2:

      select MAX(v) from (
                           select MAX(DateModified) as v from table
                           union all
                           select MAX(DateDeleted) as v from table
                         ) as SubTable
    

    编辑3:

    该死的,刚刚发现这和亚历克斯·K·叹息的解决方案是一样的……