好的,我有一个包含两个日期时间字段的表,我想选择最早的日期等于某个日期变量的行。我看到在某处使用了LEAST函数,但我不能在T-SQL中使用它
我需要这样的东西
SELECT LEAST(date1, date2) as theDate FROM theTable WHERE theDate = '2012-09-24'
但这将在T-SQL中起作用。 date1或date2有时也可以为null,因此知道这一点很重要。
答案 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函数的选择相同,而不仅仅是这个。