SQL - 从多列获取最新日期

时间:2010-06-02 15:49:33

标签: sql

假设包含以下

的行集
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

澄清:

我需要一个值 - 来自BOTH列的最大非空日期。因此,在这种情况下,所有十个细胞中最大的一个。

6 个答案:

答案 0 :(得分:7)

SELECT MAX(CASE WHEN (DateDeleted IS NULL OR DateModified > DateDeleted)
                THEN DateModified ELSE DateDeleted END) AS MaxDate
FROM Table

答案 1 :(得分:6)

对于MySQL,Postgres或Oracle,请使用GREATEST函数:

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

如果提供NULL,Oracle和MySQL都将返回NULL。该示例使用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

答案 2 :(得分:2)

作为一般解决方案,你可以尝试这样的事情:

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
  ...
)

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

答案 3 :(得分:2)

怎么样;

SELECT MAX(MX) FROM (
    SELECT MAX(DateModified) AS MX FROM Tbl
    UNION
    SELECT MAX(DateDeleted) FROM Tbl
) T

答案 4 :(得分:1)

答案取决于你真正想要的东西。如果您只想要两个日期值中的最新值,那么您可以这样做:

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

答案 5 :(得分:1)

以上都是有效答案;

但我不确定这是否有效?

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:

该死的,只是发现这是与Alex k相同的解决方案。叹息...