在日期时间字段中使用类似于T-SQL中的LEAST

时间:2012-09-24 17:03:46

标签: sql sql-server tsql datetime

  

可能重复:
  Getting the minimum of two values in sql

好的,我有一个包含两个日期时间字段的表,我想选择最早的日期等于某个日期变量的行。我看到在某处使用了LEAST函数,但我不能在T-SQL中使用它

我需要这样的东西

SELECT LEAST(date1, date2) as theDate FROM theTable WHERE theDate = '2012-09-24'

但这将在T-SQL中起作用。 date1或date2有时也可以为null,因此知道这一点很重要。

4 个答案:

答案 0 :(得分:5)

其他人提供的CASE解决方案适用于两个值的案例(没有双关语)。为了将来参考,对于三个或更多值,它变得有点不合适,你可能想要做这样的事情:

SELECT (SELECT MIN(mydate) 
        FROM (VALUES(date1),(date2),(date3)) mylist(mydate)
       ) AS theDate
FROM theTable 
WHERE theDate = '2012-09-24' 

答案 1 :(得分:4)

T-SQL中没有这样的功能。尝试:

SELECT theDate = CASE WHEN date1 < date2 THEN date1 ELSE date2 END FROM ... ;

要处理您可能需要的NULL:

SELECT theDate = NULLIF(CASE WHEN date1 < date2 THEN date1 ELSE date2 END, '20301231')
FROM 
(
  SELECT 
    date1 = COALESCE(date1, '20301231'), 
    date2 = COALESCE(date2, '20301231')
  FROM ...
) AS x;

此外,您无法在theDate子句中引用别名WHERE,但它尚不存在。你可能想说:

WHERE '20120924' IN (date1, date2);

答案 2 :(得分:1)

您可以使用case来模仿least和子查询,以便您可以参考case子句中的where结果:

select  *
from    (
        select  case 
                when date1 > date2 or date1 is null then date2
                else date1
                end as theDate
        ,       *
        from    TheTable
        )
where   theDate = '2012-09-24'

答案 3 :(得分:1)

虽然其他答案确实有效,但这里的格式是UDF,它更符合您的要求:

CREATE FUNCTION [dbo].[LeastDate] (@d1 datetime, @d2 datetime)
RETURNS datetime
AS
BEGIN
    DECLARE @least datetime

    IF @d1 is null or @d2 is null
        SET @least = null
    ELSE IF @d1 < @d2
        SET @least = @d1
    ELSE
        SET @least = @d2

    RETURN @least
END

用法:

SELECT dbo.LeastDate(date1, date2) as theDate
FROM theTable
WHERE dbo.LeastDate(date1, date2) = '2012-09-24'

或者您可以使用嵌套选择仅执行一次:

SELECT * FROM (
  SELECT dbo.LeastDate(date1, date2) as theDate FROM theTable
) t
WHERE theDate = '2012-09-24'

请注意,在where子句中单独调用函数或使用嵌套select的选择与任何SQL函数的选择相同,而不仅仅是这个。