选择两列之间的最近日期

The*_*TXI 24 sql database sql-server-2005

如果我有一个表(在其他列中)有两个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
Run Code Online (Sandbox Code Playgroud)

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

ID     MostRecentDate

1      2/1/2008

2      2/1/2008

3      1/10/2008
Run Code Online (Sandbox Code Playgroud)

有一种简单的方法可以做到这一点,我显然是在忽视它吗?我知道我可以做子查询和case语句,甚至可以在sql server中编写一个函数来处理它,但我脑子里已经知道有一个已经内置的max-compare类型函数,我只是忘记了.

Roc*_*der 42

CASE是IMHO你最好的选择:

SELECT ID,
       CASE WHEN Date1 > Date2 THEN Date1
            ELSE Date2
       END AS MostRecentDate
FROM Table
Run Code Online (Sandbox Code Playgroud)

如果其中一列可以为空,则只需要将其括起来COALESCE:

.. COALESCE(Date1, '1/1/1973') > COALESCE(Date2, '1/1/1973')
Run Code Online (Sandbox Code Playgroud)

  • 我认为就是这样.我几乎可以肯定已经建立了一个日期比较功能,我可以说"select ID,max(date1,date2)". (2认同)

小智 7

为什么不能使用 GREATEST 函数?

select id, date1, date2, GREATEST( nvl(date1,date2) , nvl(date2, date1) )
from table1;
Run Code Online (Sandbox Code Playgroud)

我包含了一个 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
Run Code Online (Sandbox Code Playgroud)

  • 问题是关于 SQL-Server 而不是 Oracle。 (4认同)
  • 在 SQL 2022 上,它存在 https://learn.microsoft.com/en-us/sql/t-sql/functions/tical-functions-greatest-transact-sql?view=azure-sqldw-latest&viewFallbackFrom=sql-server-版本15 (4认同)

JSt*_*ens 6

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

SELECT ID,
       CASE WHEN ISNULL(Date1,'01-01-1753') > ISNULL(Date2,'01-01-1753') THEN Date1
            ELSE Date2
       END AS MostRecentDate
FROM Table
Run Code Online (Sandbox Code Playgroud)


Red*_*ter 5

select ID, 
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable
Run Code Online (Sandbox Code Playgroud)

  • 是的:)在这种情况下,西部最快的枪是我的,哈哈 (2认同)

Mic*_*ren 5

您可以将其抛入标量函数,这使得处理空值更容易一些.显然它不会比内联案例陈述更快.

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
Run Code Online (Sandbox Code Playgroud)


And*_*edo 5

SQL Server 2012 开始,可以使用表达式的快捷方式IIFCASE尽管后者是 SQL 标准:

SELECT ID,
       IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
  FROM theTable
Run Code Online (Sandbox Code Playgroud)