sql - таблицу - Выбор самой последней даты между двумя столбцами




sql список дат (8)

AFAIK, нет встроенной функции для получения максимум двух значений, но вы можете написать свой собственный легко, как:

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

и назовите его

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

Если у меня есть таблица, в которой (среди других столбцов) есть два столбца DATETIME, как бы выбрать последнюю дату из этих двух столбцов.

Пример:

ID     Date1     Date2

1      1/1/2008   2/1/2008

2      2/1/2008   1/1/2008

3      1/10/2008  1/10/2008

Если бы мне хотелось, чтобы мои результаты выглядели

ID     MostRecentDate

1      2/1/2008

2      2/1/2008

3      1/10/2008

Есть ли простой способ сделать это, что я, очевидно, не замечаю? Я знаю, что могу выполнять подзапросы и case-заявления или даже писать функцию в SQL-сервере для ее обработки, но у меня было это в голове, что уже была встроена функция максимального значения сравнения, о которой я просто забываю.


Вы можете бросить это в скалярную функцию, которая упрощает обработку нулей. Очевидно, что это не будет быстрее, чем оператор inline case.

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

Кроме заявления о делах, я не верю, что ...

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

select ID, 
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable

Почему вы не могли использовать функцию GREATEST?

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

Я включил NVL, чтобы гарантировать правильную оценку NULL, иначе, если Date1 или Date2 имеет значение null, Greatest возвращает NULL.

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

Я думаю, что принятый ответ прост. Тем не менее, я бы наблюдал за нулевыми значениями в датах ...

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

Этот поток имеет несколько решений. Если у вас было более двух дат для сравнения, «непривитие» могло бы быть предпочтительным для написания ряда утверждений о случаях. В Ниикола явно похищены:

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

Тогда вы можете order by dDate , если это полезно.


CASE - ИМХО, ваш лучший вариант:

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

Если один из столбцов является нулевым, просто нужно заключить в COALESCE :

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






sql-server-2005