2013-05-09 40 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

您可以簡單地改變你的介詞的邏輯:不是「遺憾」與範圍之內的日期登記,尋找其註冊日期爲超出範圍。