选择两列之间的最新日期

问题描述 投票:25回答:13

如果我有一个表(除其他列外)有两个DATETIME列,我该如何从这两列中选择最近日期。

示例:

ID     Date1     Date2

1      1/1/2008   2/1/2008

2      2/1/2008   1/1/2008

3      1/10/2008  1/10/2008

如果我希望我的结果看起来像

ID     MostRecentDate

1      2/1/2008

2      2/1/2008

3      1/10/2008

是否有一种简单的方法可以使我明显地忽略?我知道我可以执行子查询和case语句,甚至可以在sql server中编写一个函数来处理它,但是我脑子里已经有了一个内置的max-compare类型函数,我只是忘记了。

sql database sql-server-2005
13个回答
43
投票

案例是恕我直言,您最好的选择:

SELECT ID,
       CASE WHEN Date1 > Date2 THEN Date1
            ELSE Date2
       END AS MostRecentDate
FROM Table

如果列之一为可空,只需将其括在COALESCE中:

COALESCE

0
投票

已经发布的所有其他正确答案。


0
投票
select max(d) ChangeDate
from (values(@d), (@d2)) as t(d)

0
投票
select ID,(select max(d) from (select Date1 d uninon select Date2 d) as t) as MaxDate
from MyTable

-1
投票

为什么不使用GREATEST功能?


5
投票
.. COALESCE(Date1, '1/1/1973') > COALESCE(Date2, '1/1/1973')

5
投票

您可以将其放入标量函数中,这使处理null变得容易一些。显然,它不会比内联case语句更快。

select ID, 
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable

3
投票

我认为公认的答案是最简单的。但是,我会注意日期中的空值...

ALTER FUNCTION [fnGetMaxDateTime] (
    @dtDate1        DATETIME,
    @dtDate2        DATETIME
) RETURNS DATETIME AS
BEGIN
    DECLARE @dtReturn DATETIME;

    -- If either are NULL, then return NULL as cannot be determined.
    IF (@dtDate1 IS NULL) OR (@dtDate2 IS NULL)
        SET @dtReturn = NULL;

    IF (@dtDate1 > @dtDate2)
        SET @dtReturn = @dtDate1;
    ELSE
        SET @dtReturn = @dtDate2;

    RETURN @dtReturn;
END

3
投票

SQL Server 2012,尽管SELECT ID, CASE WHEN ISNULL(Date1,'01-01-1753') > ISNULL(Date2,'01-01-1753') THEN Date1 ELSE Date2 END AS MostRecentDate FROM Table IIF表达式是SQL Standard,也可以使用快捷方式IIFCASE

SELECT ID,
       IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
  FROM theTable

2
投票

[尽可能使用InLine函数,因为它们不会遇到通常与UDF相关的性能问题...

Create FUNCTION MaximumDate 
(   
@DateTime1 DateTime,
@DateTime2 DateTime
)
RETURNS TABLE 
AS
RETURN 
(
    Select Case When @DateTime1 > @DateTime2 Then @DateTime1
                Else @DateTime2 End MaxDate
)
GO 

有关使用准则,请参见Here


1
投票

除了案例陈述,我不这么认为...

  Select Case When DateColA > DateColB Then DateColA 
              Else DateColB End MostRecent
  From Table ... 

0
投票

[AFAIK,没有内置函数来获取两个值的最大值,但是您可以很容易地编写为:]]

CREATE FUNCTION dbo.GetMaximumDate(@date1 DATETIME, @date2 DATETIME)
RETURNS DATETIME
AS
BEGIN
    IF (@date1 > @date2)
        RETURN @date1
    RETURN @date2
END

并称其为>

SELECT Id, dbo.GetMaximumDate(Date1, Date2)
FROM tableName

This thread有几种解决方案。如果要比较两个以上的日期,则“ unpivot”可能比编写一系列case语句更可取。以下是从Niikola明显被盗的内容:

select id, max(dDate) MostRecentDate
  from YourTable
    unpivot (dDate for nDate in (Date1, Date2, Date3)) as u
  group by id 

然后您可以order by dDate,如果有帮助。

已经发布的所有其他正确答案。

但是如果您仍在真正寻找MAX关键字,那么这是一种方法:

select ID , MAX(dt) from 
(  select Id , Date1 as dt from table1
   union  
   select ID , Date2 from table2
) d
group by d.Id
select max(d) ChangeDate
from (values(@d), (@d2)) as t(d)
select ID,(select max(d) from (select Date1 d uninon select Date2 d) as t) as MaxDate
from MyTable

为什么不使用GREATEST功能?

select id, date1, date2, GREATEST( nvl(date1,date2) , nvl(date2, date1) )
from table1;

我添加了NVL以确保正确评估了NULL,否则,如果Date1或Date2为null,则Greatest返回NULL。

ID  Date1       Date2       MostRecentDate
1   1/1/2008    2/1/2008    2/1/2008
2   2/1/2008    1/1/2008    2/1/2008
3   1/10/2008   1/10/2008   1/10/2008
4   -null-      2/10/2008   2/10/2008
5   2/10/2008   -null-      2/10/2008

0
投票

This thread有几种解决方案。如果要比较两个以上的日期,则“ unpivot”可能比编写一系列case语句更可取。以下是从Niikola明显被盗的内容:

© www.soinside.com 2019 - 2024. All rights reserved.