SQL 查询中的时间范围

Time Range in SQL Query

查询结果: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';

这是我的查询。我的 table 没有介于给定范围之间的值。而且没有结果。所以,我需要的是,如果范围内没有匹配项,我需要将该列的值设置为“00:00:00”。我怎样才能在查询中做到这一点?

更新

根据我们在评论中的讨论,您需要一些比简单的 case 表达式更复杂的东西。我建议的解决方案涉及使用 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 部分确保您只获取记录 '00:00:00' 如果没有时间在 '18:00:00' 之间的记录 和“20:00:00”。

  • case表达式现在测试是否有记录 对于时间范围内的 ID,以及那个时间的 returns。如果不, 它 returns '00:00:00'

第一个版本

假设我理解正确,您需要从 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;