0

我有一张带有 RepId 和日期的表。

Table: 1
RepID   logTime
108981  2013-04-09 00:00:00.000
108981  2013-04-09 00:00:00.000
108981  2013-04-11 00:00:00.000
108981  2013-04-11 00:00:00.000
108981  2013-04-11 00:00:00.000
108982  2013-04-09 00:00:00.000
108982  2013-04-10 00:00:00.000
108982  2013-04-11 00:00:00.000
108982  2013-04-11 00:00:00.000
108982  2013-04-11 00:00:00.000

如果条件不匹配中指定的日期范围内的至少一个日期,我想对表 1 中的 RepId 感到遗憾。

我写了这样的查询

select tl.repID from table1 tl where 
     CONVERT(date, logTime) > CONVERT(date,'2013-04-08 00:00:00.000') and CONVERT(date, logTime) < CONVERT(date,'2013-04-12 00:00:00.000')

这里的输出会像

RepID
108981
108982

但我想要它喜欢

RepID
108982

由于 repId - 108981 没有在 where 条件中指定日期“2013-04-10 00:00:00.000”。

----or----- 不满意的RepID和日期怎么取.....

请帮助解决这个问题......

4

3 回答 3

2

试试这样...

SELECT RepID FROM (Select RepID ,(Select Count(Distinct Cast(logTime as Date)) FROM T as A 
   WHERE 
   Cast( a.logTime as date) > Cast('2013-04-08 00:00:00.000' as date) 
   and Cast( a.logTime as date) < Cast('2013-04-12 00:00:00.000' as Date)
    AND
  A.RepID=b.RepID) AS COUNTS
   FROM T as B) as  c 
    WHERE COUNTS=datediff('2013-04-12 00:00:00.000','2013-04-08 00:00:00.000')-1 
    group by RepID

Sql 小提琴演示

于 2013-05-09T12:23:58.617 回答
0

您可以简单地更改介词的逻辑:不要“后悔”日期在范围内的寄存器,而是查找日期在范围外的寄存器。

于 2013-05-09T12:27:24.960 回答
0

可能获取一系列日期并将其与您的数据交叉连接。计算日期匹配的数字,如果它与日期之间的天数不同,则将其输出。

像这样的东西(未测试)

SELECT tl.repID, SUM(CASE WHEN CONVERT(date, logTime) = Sub1.SomeDate THEN 1 ELSE 0 END) AS MatchCount
FROM table1 tl 
CROSS JOIN 
(SELECT DATE_ADD('2013-04-08',INTERVAL 1+a.i+b.i*10 DAY) SomeDate
FROM (SELECT 0 AS i
UNION SELECT 1 AS i
UNION SELECT 2 AS i
UNION SELECT 3 AS i
UNION SELECT 4 AS i
UNION SELECT 5 AS i
UNION SELECT 6 AS i
UNION SELECT 7 AS i
UNION SELECT 8 AS i
UNION SELECT 9 AS i) a,
(SELECT 0 AS i
UNION SELECT 1 AS i
UNION SELECT 2 AS i
UNION SELECT 3 AS i
UNION SELECT 4 AS i
UNION SELECT 5 AS i
UNION SELECT 6 AS i
UNION SELECT 7 AS i
UNION SELECT 8 AS i
UNION SELECT 9 AS i) b
HAVING  SomeDate < '2013-04-12' ) Sub1
GROUP BY tl.repID
HAVING MatchCount != 3

这将处理最多 100 天的日期范围,但很容易扩展。

于 2013-05-09T12:04:36.447 回答