SQL查询中的时间范围

时间:2016-03-06 09:24:42

标签: sql sql-server sql-server-express

查询结果:my query result

select distinct information.ID, information.Name,information.Time AS OvertimeOff 
From Information
where information.Time >='18:00:00' AND information.Time <='20:00:00';

这是我的疑问。我的表没有给定范围之间的值。而且没有结果。所以,我需要的是,如果范围内没有匹配,我需要将列的值设置为'00:00:00'。我怎么能在查询中这样做?

1 个答案:

答案 0 :(得分:0)

更新

按照我们在评论中的讨论,您需要比简单的案例表达更复杂的东西。我建议的解决方案涉及使用common table expression,以及case表达式和where子句:

;WITH cte As
(
    SELECT id 
    FROM Information
    WHERE Time >= '18:00:00' AND Time <= '20:00:00'
)

SELECT DISTINCT information.ID, 
   information.Name,
   CASE WHEN NOT EXISTS(SELECT 1 FROM cte WHERE cte.Id = information.ID) THEN
       '00:00:00'
   ELSE
       information.Time 
   END AS OvertimeOff 
FROM Information
WHERE 
    (
    information.Time >= '18:00:00' 
    AND information.Time <= '20:00:00'
    )
OR NOT EXISTS(SELECT 1 FROM cte WHERE cte.Id = information.ID);

细分:

  • cte只是用来缩短子查询(因为它是 在case表达式和where子句中相同。

  • where子句的NOT EXISTS部分确保您只获取记录 &#39; 00:00:00&#39;如果没有记录时间介于&lt; 18:00:00&#39; 和&#39; 20:00:00&#39;。

  • 案例表达式现在测试是否有记录 对于具有范围内时间的id,并返回该时间。如果不, 它返回&#39; 00:00:00&#39;

第一个版本

假设我正确理解了这个问题,你需要从where子句中删除条件并将其放在select子句中的case表达式中。
像这样:

SELECT DISTINCT information.ID, 
       information.Name,
       CASE WHEN information.Time >='18:00:00' AND information.Time <='20:00:00' THEN
           information.Time 
       ELSE
           '00:00:00'
       END AS OvertimeOff 
FROM Information;