2012-06-04 45 views
1

充分利用连续的值,我在我的数据库有一排:在特定的时间

starttime:4/6/2012 2:00pm, Endtime:31/12/9999, name:"swetha", status:"open"..... 

当我更新此行,我改变了开始时间为当前时间(getdate()),没有问题。我每天凌晨1点运行Windows Service来修改行中的值。

我想在4/6/​​2012 11:59 pm我的服务运行时知道我的行的状态。

没有必要在2012年4月6日晚上11:59进行更新,最近一次更新可能在一天中的任何时间,但是我的要求是在2012年4月6日获取状态值11 :59 pm。

我想在SQL Server 2008中查询。谁能帮我找到解决方案吗?

+0

使用视图在SQL Server中的预编译形式。 –

回答

1

尝试这些解决方案(第一个解决方案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