38 Stimmen

Auswahl des jüngsten Datums zwischen zwei Spalten

Wenn ich eine Tabelle habe, die (neben anderen Spalten) zwei DATETIME-Spalten hat, wie würde ich die am aktuellsten Datum aus diesen beiden Spalten.

Beispiel:

ID     Date1     Date2

1      1/1/2008   2/1/2008

2      2/1/2008   1/1/2008

3      1/10/2008  1/10/2008

Wenn ich möchte, dass meine Ergebnisse wie folgt aussehen

ID     MostRecentDate

1      2/1/2008

2      2/1/2008

3      1/10/2008

Gibt es eine einfache Möglichkeit, dies zu tun, die ich offensichtlich übersehe? Ich weiß, ich kann Unterabfragen und Fall-Anweisungen tun oder sogar eine Funktion in Sql-Server schreiben, um es zu behandeln, aber ich hatte es in meinem Kopf, dass es eine max-Compare-Typ-Funktion bereits in, die ich gerade vergessen.

64voto

Rockcoder Punkte 7999

CASE ist IMHO Ihre beste Option:

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

Wenn eine der Spalten nullbar ist, müssen Sie sie einfach in COALESCE :

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

12voto

Andre Figueiredo Punkte 11844

Von SQL Server 2012 ist es möglich, die Abkürzung zu verwenden IIF a CASE Ausdruck, obwohl letzterer SQL-Standard ist:

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

8voto

matt Punkte 41

Warum konnten Sie nicht die Funktion GREATEST verwenden?

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

Ich habe eine NVL eingefügt, um sicherzustellen, dass NULL korrekt ausgewertet wurde, denn wenn entweder Date1 oder Date2 Null ist, gibt Greatest NULL zurück.

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

6voto

JStevens Punkte 2028

Ich denke, die akzeptierte Antwort ist die einfachste. Ich würde jedoch auf Nullwerte in den Daten achten...

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

5voto

Michael Haren Punkte 101002

Sie können dies in eine skalare Funktion werfen, was den Umgang mit Nullen ein wenig einfacher macht. Natürlich wird es nicht schneller sein als die Inline-Case-Anweisung.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X