This thread有几种解决方案。如果要比较两个以上的日期,则“ unpivot”可能比编写一系列case语句更可取。以下是从Niikola明显被盗的内容:
如果我有一个表(除其他列外)有两个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 server中编写一个函数来处理它,但是我脑子里已经有了一个内置的max-compare类型函数,我只是忘记了。
案例是恕我直言,您最好的选择:
SELECT ID,
CASE WHEN Date1 > Date2 THEN Date1
ELSE Date2
END AS MostRecentDate
FROM Table
如果列之一为可空,只需将其括在COALESCE
中:
COALESCE
已经发布的所有其他正确答案。
select max(d) ChangeDate
from (values(@d), (@d2)) as t(d)
select ID,(select max(d) from (select Date1 d uninon select Date2 d) as t) as MaxDate
from MyTable
为什么不使用GREATEST功能?
.. COALESCE(Date1, '1/1/1973') > COALESCE(Date2, '1/1/1973')
您可以将其放入标量函数中,这使处理null变得容易一些。显然,它不会比内联case语句更快。
select ID,
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable
我认为公认的答案是最简单的。但是,我会注意日期中的空值...
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
从SQL Server 2012,尽管SELECT ID,
CASE WHEN ISNULL(Date1,'01-01-1753') > ISNULL(Date2,'01-01-1753') THEN Date1
ELSE Date2
END AS MostRecentDate
FROM Table
到IIF
表达式是SQL Standard,也可以使用快捷方式IIF
到CASE
:
SELECT ID,
IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
FROM theTable
[尽可能使用InLine函数,因为它们不会遇到通常与UDF相关的性能问题...
Create FUNCTION MaximumDate
(
@DateTime1 DateTime,
@DateTime2 DateTime
)
RETURNS TABLE
AS
RETURN
(
Select Case When @DateTime1 > @DateTime2 Then @DateTime1
Else @DateTime2 End MaxDate
)
GO
有关使用准则,请参见Here
除了案例陈述,我不这么认为...
Select Case When DateColA > DateColB Then DateColA
Else DateColB End MostRecent
From Table ...
[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
This thread有几种解决方案。如果要比较两个以上的日期,则“ unpivot”可能比编写一系列case语句更可取。以下是从Niikola明显被盗的内容:
select id, max(dDate) MostRecentDate
from YourTable
unpivot (dDate for nDate in (Date1, Date2, Date3)) as u
group by id
然后您可以order by dDate
,如果有帮助。
已经发布的所有其他正确答案。
但是如果您仍在真正寻找MAX关键字,那么这是一种方法:
select ID , MAX(dt) from
( select Id , Date1 as dt from table1
union
select ID , Date2 from table2
) d
group by d.Id
select max(d) ChangeDate
from (values(@d), (@d2)) as t(d)
select ID,(select max(d) from (select Date1 d uninon select Date2 d) as t) as MaxDate
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
This thread有几种解决方案。如果要比较两个以上的日期,则“ unpivot”可能比编写一系列case语句更可取。以下是从Niikola明显被盗的内容: