it-swarm.com.de

Aktuelles Datum zwischen zwei Spalten auswählen

Wenn ich eine Tabelle habe, die (unter anderen Spalten) zwei DATETIME-Spalten hat, wie würde ich dann das Datum das aktuellste aus diesen beiden Spalten auswählen.

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 wollte, dass meine Ergebnisse aussehen 

ID     MostRecentDate

1      2/1/2008

2      2/1/2008

3      1/10/2008

Gibt es eine einfache Möglichkeit, dies zu übersehen? Ich weiß, ich kann Unterabfragen und Case-Anweisungen ausführen oder sogar eine Funktion in SQL Server schreiben, um damit umzugehen, aber ich hatte im Kopf, dass bereits eine Max-Compare-Funktion eingebaut wurde, die ich gerade vergesse.

21
TheTXI

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 nullfähig ist, müssen Sie nur in COALESCE :

.. COALESCE(Date1, '1/1/1973') > COALESCE(Date2, '1/1/1973')
36
Rockcoder
select ID, 
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable
5
RedFilter

Sie können dies in eine Skalarfunktion einfügen, was die Handhabung von Nullen etwas einfacher macht. Natürlich ist es nicht schneller 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
5
Michael Haren

Verwenden Sie nach Möglichkeit InLine-Funktionen, da bei ihnen keine der allgemein mit UDFs verbundenen Leistungsprobleme auftreten ...

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

Hinweise zur Verwendung finden Sie unter Here

2
Charles Bretana

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

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

Abgesehen von der Fallerklärung glaube ich nicht ... 

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

Ab SQL Server 2012 Es ist möglich, die Verknüpfung IIF zu CASE zu verwenden, obwohl der letzte SQL-Standard ist:

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

Dieser Thread hat mehrere Lösungen. Wenn Sie mehr als zwei Datumsangaben zum Vergleich hatten, ist "unpivot" dem Schreiben einer Reihe von Fallanweisungen vorzuziehen. Folgendes wird aus Niikola offensichtlich gestohlen:

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

Dann können Sie order by dDate, wenn das hilfreich ist.

0
Michael

AFAIK, es gibt keine integrierte Funktion, um das Maximum von zwei Werten zu erhalten. Sie können jedoch leicht eigene Werte schreiben:

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

und nennen es als

SELECT Id, dbo.GetMaximumDate(Date1, Date2)
FROM tableName
0
Recep
select max(d) ChangeDate
from (values(@d), (@d2)) as t(d)
0
syb

Alle anderen richtigen Antworten, wie bereits gepostet.

Wenn Sie jedoch noch wirklich nach einem MAX-Schlüsselwort suchen, finden Sie hier einen Weg: 

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