Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在两列之间选择最近日期_Sql_Database_Sql Server 2005 - Fatal编程技术网

Sql 在两列之间选择最近日期

Sql 在两列之间选择最近日期,sql,database,sql-server-2005,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 如果我想让我的结果看起来像 ID MostRecentDate 1 2/1/2008 2 2/1/2008 3 1/10/2008 有没有一个简

如果我的表(在其他列中)有两个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类型的函数,我只是忘记了它。

case是您最好的选择:

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

如果其中一列可为空,则只需将其括在:


除了案件陈述,我不这么认为

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

您可以将其放入标量函数中,这使得处理空值变得更加容易。显然,它不会比内联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

只要可能,使用内联函数,因为它们不会遇到通常与UDF相关的性能问题

Create FUNCTION MaximumDate 
(   
@DateTime1 DateTime,
@DateTime2 DateTime
)
RETURNS TABLE 
AS
RETURN 
(
    Select Case When @DateTime1 > @DateTime2 Then @DateTime1
                Else @DateTime2 End MaxDate
)
GO 

有关使用指南,请参见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
有几种解决方案。如果您有两个以上的日期要比较,“unpivot”可能比编写一系列案例陈述更可取。以下内容是明目张胆地从以下地点窃取的:


然后,如果有帮助的话,您可以按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 id, date1, date2, GREATEST( nvl(date1,date2) , nvl(date2, date1) )
from table1;
我包含了一个NVL,以确保正确计算NULL,否则,如果Date1或Date2为NULL,则最大值返回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

SQL Server 2012可以使用
CASE
表达式的快捷方式,尽管后者是SQL标准:

SELECT ID,
       IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
  FROM theTable

看起来我们有一个共识:)我想是这样的。我几乎可以肯定的是,已经构建了一个日期比较函数,我可以说“selectid,max(date1,date2)”。这就是我将来要做的。我在这个问题上使用case方法是因为它很简单,但是我应该使用maximum date函数。这是最好的答案。问题是关于SQL Server而不是Oracle的。虽然这个答案可能是正确的。只有代码的答案很少有帮助。请评论您的代码,并解释此代码如何解决问题。
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 max(d) ChangeDate
from (values(@d), (@d2)) as t(d)
SELECT ID,
       IIF(DateColA > DateColB, DateColA, DateColB) AS MostRecentDate
  FROM theTable
select ID,(select max(d) from (select Date1 d uninon select Date2 d) as t) as MaxDate
from MyTable