The Prison Domain Model Challange: Answers
Chris Bilson give a nearly complete answer of how to find the valid / invalid commands for an inmate in the comments of the post. It is a very elegant solution, in my opinion. I took upon myself to improve his solution a bit. The result is this query:
        SELECT             
               inmate.FirstName,         
               inmate.Surname,         
               command.IssuedAt AS Start,         
               dbo.CommandEnds(command.CommandType, command.ValidFor, command.IssuedAt) AS [End],
               nextCommand.IssuedAt AS StartOfNextCommand,
               CASE         
               WHEN DateDiff(ms,         
                      dbo.CommandEnds(command.CommandType, command.ValidFor, command.IssuedAt) ,         
                      nextCommand.IssuedAt) > 0 THEN 'Gap In Commands!'
               WHEN getdate() > dbo.CommandEnds(command.CommandType, command.ValidFor, command.IssuedAt)
                      AND  nextCommand.Id is null THEN 'Command ended!'
               ELSE 'Fine' END AS Status
        FROM dbo.Commands command INNER JOIN dbo.Inmates inmate         
                      ON     command.InmateID = inmate.ID
               LEFT OUTER JOIN dbo.Commands nextCommand         
                      ON     nextCommand.InmateID = inmate.Id
                      AND nextCommand.IssuedAt = (SELECT MIN(IssuedAt)         
                                   FROM dbo.Commands c3         
                                   WHERE c3.InmateId = inmate.Id         
                                   AND c3.IssuedAt >  command.IssuedAt )
        ORDER BY inmate.Id, Start, [End]     
The nice part about this solution that how the query match a command with the (logical) next command. Here is the result of the query:
| FirstName | Surname | Start | End | StartOfNextCommand | Status | 
| Bad | Man | 2/5/2006 6:39 PM | 10/5/2006 6:39 PM | 10/5/2006 6:40 PM | Gap In Commands! | 
| Bad | Man | 10/5/2006 6:40 PM | 11/5/2006 6:40 PM | NULL | Fine | 
| Nasty | Guy | 3/5/2006 12:00 AM | 8/5/2006 12:00 AM | 7/5/2006 5:00 PM | Fine | 
| Nasty | Guy | 7/5/2006 5:00 PM | 9/5/2006 5:00 PM | NULL | Fine | 
I wish that I had something similar when I needed to do this kind of software when I needed it.
 

Comments
Comment preview