2013-05-09 38 views
0

我有一个带有RepId和日期的表。不使用sql选择不满足条件的id

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'。

---- -----或如何 采取REPID并不满意日期.....

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

+0

这是MySQL还是MSSQL? – Kickstart 2013-05-09 11:48:13

+0

它的MySql查询 – Renuka 2013-05-09 11:49:39

+3

我很肯定[“遗憾”](http://dictionary.reference.com/browse/regret)并不意味着你的想法。 – JJJ 2013-05-09 11:50:07

回答

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天的日期范围,但很容易扩展。

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 Fiddle Demo

+0

如果你只是想要所有日期的记录项目(或用最少的更改项目不使用日期),那么这是一个比我更好的解决方案。它应该更快,并且可以轻松应对更大的日期范围。唯一的缺点是如果你想列出未使用的日期,但从描述中不需要。 – Kickstart 2013-05-09 13:22:25

+0

感谢您的帮助.......它工作正常...非常感谢.... – Renuka 2013-05-09 13:35:28

+0

欢迎@Renuka .....但不要忘记接受答案...看到这里为什么它是必要的..http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – 2013-05-09 14:14:59

0

您可以简单地改变你的介词的逻辑:不是“遗憾”与范围之内的日期登记,寻找其注册日期为超出范围。