2

可能重复:
在 sql 中获取两个值中的最小值

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

我需要这样的东西

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

但这将在 T-SQL 中工作。date1 或 date2 有时也可能为空,因此了解这一点可能很重要。

4

4 回答 4

6

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

SELECT (SELECT MIN(mydate) 
        FROM (VALUES(date1),(date2),(date3)) mylist(mydate)
       ) AS theDate
FROM theTable 
WHERE theDate = '2012-09-24' 
于 2012-09-24T17:23:40.600 回答
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;

此外,您不能theDateWHERE子句中引用别名,它还不存在。你可能想说:

WHERE '20120924' IN (date1, date2);
于 2012-09-24T17:05:10.993 回答
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 子句中单独调用函数或使用嵌套选择的选择与任何 SQL 函数的选择相同,而不仅仅是这个。

于 2012-09-24T17:25:04.050 回答
1

您可以使用 a caseto mimicleast和一个子查询,以便您可以在子句中引用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'
于 2012-09-24T17:05:30.227 回答