可能重复:
在 sql 中获取两个值中的最小值
好的,我有一个包含两个日期时间字段的表,我想选择最早日期等于某个日期变量的行。我在某处看到了 LEAST 函数,但我不能在 T-SQL 中使用它
我需要这样的东西
SELECT LEAST(date1, date2) as theDate FROM theTable WHERE theDate = '2012-09-24'
但这将在 T-SQL 中工作。date1 或 date2 有时也可能为空,因此了解这一点可能很重要。
可能重复:
在 sql 中获取两个值中的最小值
好的,我有一个包含两个日期时间字段的表,我想选择最早日期等于某个日期变量的行。我在某处看到了 LEAST 函数,但我不能在 T-SQL 中使用它
我需要这样的东西
SELECT LEAST(date1, date2) as theDate FROM theTable WHERE theDate = '2012-09-24'
但这将在 T-SQL 中工作。date1 或 date2 有时也可能为空,因此了解这一点可能很重要。
其他人提供的 CASE 解决方案适用于两个值的情况(没有双关语)。为了将来参考,对于三个或更多值来说它变得有点笨拙,然后你可能想要做这样的事情:
SELECT (SELECT MIN(mydate)
FROM (VALUES(date1),(date2),(date3)) mylist(mydate)
) AS theDate
FROM theTable
WHERE theDate = '2012-09-24'
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);
虽然其他答案确实有效,但这里是 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 函数的选择相同,而不仅仅是这个。
您可以使用 a case
to 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'