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.

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

2voto

Charles Bretana Punkte 137391

Abgesehen von der Aussage über den Fall, glaube ich nicht...

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

2voto

Charles Bretana Punkte 137391

Wann immer es möglich ist, sollten Sie InLine-Funktionen verwenden, da diese keine der Leistungsprobleme aufweisen, die im Allgemeinen mit UDFs verbunden sind...

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

Leitlinien für die Verwendung finden Sie unter Aquí

2voto

Recep Punkte 17753

AFAIK, gibt es keine eingebaute Funktion, um das Maximum von zwei Werten zu erhalten, aber Sie können Ihre eigene leicht als schreiben:

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

und rufen sie als

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

1voto

Dhananjay Punkte 3515

Alle anderen richtigen Antworten wurden bereits veröffentlicht.

Wenn Sie aber immer noch auf der Suche nach dem MAX-Schlüsselwort sind, dann gibt es hier eine Möglichkeit:

select ID , MAX(dt) from 
(  select Id , Date1 as dt from table1
   union  
   select ID , Date2 from table2
) d
group by d.Id

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