2008-09-23 103 views
3

我有看起来像这样的一个MSSQL数据库中的表:SQL查询来确定状态?

Timestamp (datetime) 
Message (varchar(20)) 

每天一次,特定进程插入当前时间和“开始”启动时的消息。完成后插入当前时间和消息'完成'。

什么是好的查询或语句集合,给定一个特定的日期,返回:

  • 0,如果进程从来没有开始
  • 1,如果该进程启动但未完成
  • 2如果进程已启动并完成

表中还有其他消息,但“已启动”和“已完成”对于此过程是唯一的。

编辑:对于奖金因缘,如果数据是无效的引发错误,例如有两个“已启动”的消息,或者是有“完成”不具有“已启动”。

+0

这个过程是否可以延续到第二天?例如它在下午11:59:59开始,并在第二天的某个时间结束 – 2008-09-23 17:13:28

+0

其可能的情况是,第一天的状态为1,第二天为错误。 – 2008-09-23 17:14:33

回答

2
Select Count(Message) As Status 
From Process_monitor 
Where TimeStamp >= '20080923' 
     And TimeStamp < '20080924' 
     And (Message = 'Started' or Message = 'Finished') 

可以略微修改此检测无效的条件,例如多开始,结束,开始没有结束,等...

Select Case When SumStarted = 0 And SumFinished = 0 Then 'Not Started' 
      When SumStarted = 1 And SumFinished = 0 Then 'Started' 
      When SumStarted = 1 And SumFinished = 1 Then 'Finished' 
      When SumStarted > 1 Then 'Multiple Starts' 
      When SumFinished > 1 Then 'Multiple Finish' 
      When SumFinished > 0 And SumStarted = 0 Then 'Finish Without Start' 
      End As StatusMessage 
From (
      Select Sum(Case When Message = 'Started' Then 1 Else 0 End) As SumStarted, 
       Sum(Case When Message = 'Finished' Then 1 Else 0 End) As SumFinished 
      From Process_monitor 
      Where TimeStamp >= '20080923' 
       And TimeStamp < '20080924' 
       And (Message = 'Started' or Message = 'Finished') 
     ) As AliasName 
+0

'检测无效条件'代码的第2行存在拼写错误。应该是'... AndSumFinished = 0然后...'。虽然答案很好。 – 2008-09-24 13:52:34

0
DECLARE @TargetDate datetime 
SET @TargetDate = '2008-01-01' 

DECLARE @Messages varchar(max) 

SET @Messages = '' 

SELECT @Messages = @Messages + '|' + Message 
FROM process_monitor 
WHERE @TargetDate <= Timestamp and Timestamp < DateAdd(dd, 1, @TargetDate) 
    and Message in ('Finished', 'Started') 
ORDER BY Timestamp desc 

SELECT CASE 
    WHEN @Messages = '|Finished|Started' THEN 2 
    WHEN @Messages = '|Started' THEN 1 
    WHEN @Messages = '' THEN 0 
    ELSE -1 
END 
+0

Editted:让旧代码“结束前开始”的情况下返回2. – 2008-09-23 18:04:15

-1
select count(*) from process_monitor 
where timestamp > yesterday and timestamp < tomorrow. 

或者,你可以使用具有最大自连接,以显示某一天的最新消息:

select * from process_monitor where 
timestamp=(select max(timestamp) where timestamp<next_day); 
0

您错过了唯一标识过程的列。让我们添加一个名为ProcessID的int列。您还需要另一张表来识别进程。如果您依赖于原始表,则永远不会知道从未启动的进程,因为该进程不会有任何行。

select 
    ProcessID, 
    ProcessName, 

    CASE 
    WHEN 
     (Select 
      COUNT(*) 
     from 
      ProcessActivity 
     where 
      ProcessActivity.processid = Processes.processid 
      and Message = 'STARTED') = 1 

     And 
     (Select 
      COUNT(*) 
     from 
      ProcessActivity 
     where 
      ProcessActivity.processid = Processes.processid 
      and Message = 'FINISHED') = 0 
    THEN 1 

    WHEN 
     (Select 
      COUNT(*) 
     from 
      ProcessActivity 
     where 
      ProcessActivity.processid = Processes.processid 
      and Message = 'STARTED') = 1 
     And 
     (Select 
      COUNT(*) 
     from 
      ProcessActivity 
     where 
      ProcessActivity.processid = Processes.processid 
      and Message = 'FINISHED') = 1 
THEN 2 
    ELSE 0 

END as Status 

From 
    Processes