The*_*TXI 24 sql database sql-server-2005
如果我有一个表(在其他列中)有两个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
Run Code Online (Sandbox Code Playgroud)
如果我希望我的结果看起来像
ID MostRecentDate
1 2/1/2008
2 2/1/2008
3 1/10/2008
Run Code Online (Sandbox Code Playgroud)
有一种简单的方法可以做到这一点,我显然是在忽视它吗?我知道我可以做子查询和case语句,甚至可以在sql server中编写一个函数来处理它,但我脑子里已经知道有一个已经内置的max-compare类型函数,我只是忘记了.
Roc*_*der 42
CASE是IMHO你最好的选择:
SELECT ID,
CASE WHEN Date1 > Date2 THEN Date1
ELSE Date2
END AS MostRecentDate
FROM Table
Run Code Online (Sandbox Code Playgroud)
如果其中一列可以为空,则只需要将其括起来COALESCE:
.. COALESCE(Date1, '1/1/1973') > COALESCE(Date2, '1/1/1973')
Run Code Online (Sandbox Code Playgroud)
小智 7
为什么不能使用 GREATEST 函数?
select id, date1, date2, GREATEST( nvl(date1,date2) , nvl(date2, date1) )
from table1;
Run Code Online (Sandbox Code Playgroud)
我包含了一个 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
Run Code Online (Sandbox Code Playgroud)
我认为接受的答案是最简单的。但是,我会注意日期中的空值......
SELECT ID,
CASE WHEN ISNULL(Date1,'01-01-1753') > ISNULL(Date2,'01-01-1753') THEN Date1
ELSE Date2
END AS MostRecentDate
FROM Table
Run Code Online (Sandbox Code Playgroud)
select ID,
case
when Date1 > Date2 then Date1
else Date2
end as MostRecentDate
from MyTable
Run Code Online (Sandbox Code Playgroud)
您可以将其抛入标量函数,这使得处理空值更容易一些.显然它不会比内联案例陈述更快.
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
Run Code Online (Sandbox Code Playgroud)
从SQL Server 2012 开始,可以使用表达式的快捷方式IIF,CASE尽管后者是 SQL 标准:
SELECT ID,
IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
FROM theTable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50770 次 |
| 最近记录: |