2016-09-09 4 views
-1

herauszufinden, wie eine Funktion schreiben, die den jeweils neuesten Termin unabhängig von der Anzahl der Tage, in die Funktion übergeben in SQL serverspätestes Datum unter n Datumsspalten in SQL Server

Ex gibt.

Greatest(date1,date2,date3,date4,date5) 
Greatest(date1,date2,date3) 
+0

Können Sie etwas Code einfügen, den Sie ausprobiert haben? – owczarek

+0

'wählen max (date_cl) aus ( \t wählen date_0 date_cl Vereinigung alle \t wählen Datum_1 Vereinigung alle \t .... \t wählen date_n ) x' – Praveen

+0

Ich versuchte Tabelle Array. Das erwartet, Werte in die Funktion einzufügen. Aber ich muss diese Funktion von verschiedenen Prozeduren mit verschiedenen Werten aufrufen. –

Antwort

0

Hier ist ein Weg, Table valued constructor

SELECT *, 
     (SELECT Max(dates) 
     FROM (VALUES (date1), 
         (date2)) tc(dates)) as Max_date 
FROM (SELECT '2015-01-01' AS date1, 
       '2016-01-01' AS date2) a 
0

Sehen Sie diese Lösung mit Proben unter Verwendung von:

WITH Src AS 
(
    SELECT * FROM (VALUES 
    (GETDATE(), GETDATE()+1, GETDATE()-2), 
    (GETDATE()-3, GETDATE()+1, GETDATE()+4) 
    )T(Date1, Date2, Date3) 
) 
SELECT * 
FROM Src 
CROSS APPLY (SELECT MAX(D) FROM (VALUES (Date1), (Date2), (Date3)) T(D)) T(MaxDate) 

Treat CROSS APPLY (SELECT MAX(D) FROM (VALUES (A), (B), ..., (Z)) T(D)) als Greatest(A, B, ... Z).

0

Erstellen Sie eine Funktion mit Parametern, wie Sie benötigen.

CREATE FUNCTION Greatest 
(
    @Param1 DATETIME, 
    @Param2 DATETIME, 
    @Param3 DATETIME, 
    @Param4 DATETIME, 
    @Param5 DATETIME, 
    @Param6 DATETIME, 
    @Param7 DATETIME, 
    @Param8 DATETIME, 
    @Param9 DATETIME  
) 
RETURNS DATETIME 
AS 
BEGIN 

    DECLARE @MaxDate DATETIME 

    SELECT @MaxDate = MAX(dates) 
    FROM 
    (
     VALUES (@Param1), 
      (@Param2), 
      (@Param3), 
      (@Param4), 
      (@Param5), 
      (@Param6), 
      (@Param7), 
      (@Param8), 
      (@Param9) 
    ) t(dates) 

    RETURN @MaxDate 

END 
GO 

Verwendung von.

SELECT dbo.Greatest('2016.01.01', '2015.01.02', DEFAULT, DEFAULT, DEFAULT,DEFAULT,DEFAULT,DEFAULT,DEFAULT) -- 2016-01-01 
SELECT dbo.Greatest('2016.01.01', '2015.01.02', '2016.08.20', '2014.07.06', '2013.08.01','2012.01.01',DEFAULT,DEFAULT,DEFAULT) -- 2016-08-20 
Verwandte Themen