I\'m using SQL Server 2008;
Suppose I have a table \'X\' with columns \'Date1\', \'Date2\', \'Dateblah\', all of type DateTime.
I want to select the min valu
based on scalar function (from Tom Hunter):
SELECT ID, (SELECT MIN([date]) FROM (VALUES(Date1),(Date2),(Dateblah)) x([date])) MinDate
FROM TableName
Simply lets say the table where your dates are is called sells and it has two date fields Date1 and Date2 from which you want the minimum.
SELECT (
SELECT MIN([x])
FROM (VALUES(Date1),(Date2)) x([x])
) as minimum
FROM sells
Implementing a scalar function:
CREATE FUNCTION [dbo].[MIN](@a SQL_VARIANT, @b SQL_VARIANT)
RETURNS SQL_VARIANT
AS
BEGIN
RETURN (
SELECT MIN([x])
FROM (VALUES(@a),(@b)) x([x])
)
END
GO
DECLARE @a DATETIME = '12 JUL 2011', @b DATETIME = '20 AUG 2011'
SELECT [dbo].[MIN](@a, @b)
DECLARE @c INT = 12, @d INT = 32
SELECT [dbo].[MIN](@c, @d)
There is no built in function to return the min/max of two (or more) columns. You could implement your own scalar function to do this.
In SQL Server 2005+ you could use UNPIVOT to turn the columns into rows and then use the MIN function:
CREATE TABLE [X]
(
[ID] INT,
[Date1] DATETIME,
[Date2] DATETIME,
[Date3] DATETIME
)
INSERT [X]
VALUES (0, '09/29/2011', '09/20/2011', '09/01/2011'),
(1, '01/01/2011', '01/05/2011', '03/03/2010')
SELECT [ID], MIN([Date]) AS [MinDate]
FROM [X]
UNPIVOT (
[Date] FOR d IN
([Date1]
,[Date2]
,[Date3])
) unpvt
GROUP BY [ID]