尝试这些解决方案(第一个解决方案can be found here):
SET ANSI_WARNINGS ON;
GO
IF OBJECT_ID('dbo.GetTaskStatus') IS NULL
EXECUTE (N'
CREATE FUNCTION dbo.GetTaskStatus(
@StartTime SMALLDATETIME,
@EndTime SMALLDATETIME,
@StatusTime SMALLDATETIME = NULL
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT StartTime = @StartTime,
EndTime = @EndTime,
StatusTime = @StatusTime,
StatusID =
CASE
WHEN ISNULL(@StatusTime, GETDATE()) < @StartTime THEN 1 --Not started
WHEN @StartTime < ISNULL(@StatusTime, GETDATE()) AND (ISNULL(@StatusTime, GETDATE()) < @EndTime OR @EndTime IS NULL) THEN 2 --Open
ELSE 3 --Ended
END')
GO
DECLARE @Tasks TABLE
(
TaskID INT IDENTITY PRIMARY KEY,
Name NVARCHAR(50) NOT NULL,
StartTime SMALLDATETIME NOT NULL,
EndTime SMALLDATETIME NULL,
CHECK (StartTime < EndTime),
StatusID AS
CASE
WHEN GETDATE() < StartTime THEN 1 --Not started
WHEN StartTime < GETDATE() AND (GETDATE() < EndTime OR EndTime IS NULL) THEN 2 --Open
ELSE 3 --Ended
END
);
INSERT @Tasks (Name, StartTime, EndTime)
SELECT 'Analysis', '2012-01-01T09:00:00', '2012-01-31T18:00:00'
UNION ALL
SELECT 'Design', '2012-02-15T09:00:00', '2012-02-29T18:00:00'
UNION ALL
SELECT 'Development', '2012-03-01T09:00:00', NULL
UNION ALL
SELECT 'Testing', '2012-07-01T09:00:00', NULL;
--[Solution 1]
SELECT * --StatusID = CurrentStatusID
FROM @Tasks t;
--[Solution 2]
SELECT t.*, --StatusID = CurrentStatusID
f1.StatusID AS CurrentStatusID,
f2.StatusID AS [2012-01-18T00:00:00 StatusID]
FROM @Tasks t
CROSS APPLY dbo.GetTaskStatus(t.StartTime, t.EndTime, DEFAULT) f1
CROSS APPLY dbo.GetTaskStatus(t.StartTime, t.EndTime, '2012-01-18T00:00:00') f2
结果:
TaskID Name StartTime EndTime StatusID
------ ----------- ------------------- ------------------- --------
1 Analysis 2012-01-01 09:00:00 2012-01-31 18:00:00 3
2 Design 2012-02-15 09:00:00 2012-02-29 18:00:00 3
3 Development 2012-03-01 09:00:00 NULL 2
4 Testing 2012-07-01 09:00:00 NULL 1
(4 row(s) affected)
TaskID Name StartTime EndTime StatusID CurrentStatusID 2012-01-18T00:00:00 StatusID
------ ----------- ------------------- ------------------- -------- --------------- ----------------------------
1 Analysis 2012-01-01 09:00:00 2012-01-31 18:00:00 3 3 2
2 Design 2012-02-15 09:00:00 2012-02-29 18:00:00 3 3 1
3 Development 2012-03-01 09:00:00 NULL 2 2 1
4 Testing 2012-07-01 09:00:00 NULL 1 1 1
使用视图在SQL Server中的预编译形式。 –