2016-09-09 3 views
-1

Как написать функцию, которая дает самую последнюю дату независимо от количества дат, переданных в функцию в SQL serverузнать последнюю дату из дат п столбцов в SQL Server

Ex.

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

Можете вставить код, который вы пробовали? – owczarek

+0

'выбрать макс (date_cl) из ( \t выберите date_0 date_cl профсоюзу все \t выберите дата_1 объединение всех \t .... \t выбрать date_n ) x' – Praveen

+0

Я попытался с помощью массива таблицы. Это предполагает вставить значения в fuction. Но мне нужно вызвать эту функцию из разных процедур с разными значениями. –

ответ

0

Вот один из способов, используя 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

См это решение с образцами:

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) 

Обрабатывать CROSS APPLY (SELECT MAX(D) FROM (VALUES (A), (B), ..., (Z)) T(D)), как Greatest(A, B, ... Z).

0

Создайте функцию с параметрами по мере необходимости.

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 

Использование.

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 
Смежные вопросы