2016-11-10 62 views
0

我有一个名为'Events'的表,它存储有关事件的信息,包括有效的开始和结束日期。该事件可能随时间发生多次。如果该事件当前有效,我需要排除给定事件的所有记录。在我下面的例子中,我只想返回一个单值'奥运',因为这是唯一一个在今天的日子不活跃的事件(今天是10/11/16,因为我写这个)。排除所有记录,如果1次发生当前有效

 
╔═══════════╦════════════╦════════════╗ 
║ Event ║ Start ║ End  ║ 
╠═══════════╬════════════╬════════════╣ 
║ World Cup ║ 1/07/2016 ║ 15/07/2016 ║ 
║ Olympics ║ 15/08/2016 ║ 25/08/2016 ║ 
║ World Cup ║ 1/09/2016 ║ 15/09/2016 ║ 
║ Olympics ║ 15/09/2016 ║ 25/09/2016 ║ 
║ Olympics ║ 15/10/2016 ║ 25/10/2016 ║ 
║ World Cup ║ 1/11/2016 ║ 15/11/2016 ║ 
║ World Cup ║ 1/12/2016 ║ 15/12/2016 ║ 
╚═══════════╩════════════╩════════════╝ 

回答

1
SELECT distinct Event 
FROM tableName WHERE Event NOT IN (SELECT Event 
            FROM tableName 
            WHERE CONVERT(VARCHAR(11),GETDATE(),103) BETWEEN StartDate AND EndDate 
           ) 
+0

这将返回重复记录。 –

+0

使用明显解决了这个问题 –

1

这应该做的伎俩。

SELECT DISTINCT event 
FROM table 
WHERE NOT EXISTS (
    SELECT 1 
    FROM table 
    WHERE GETDATE() >= start 
    AND GETDATE()<= end 
) 
0

试试这个它会工作,并给你回答,你想: 仅是不是今天的日期活动的事件:输出为“奥运”

SELECT Top 1 [Event] FROM Events WHERE CONVERT(VARCHAR(11),GETDATE(),103) 
NOT BETWEEN [Start] AND [End] 
0

这一个使用MySQL的工作对我来说,更改一些宏,它应该在SQL服务器上工作。

SELECT event,count(event) 
FROM table_name 
WHERE event NOT IN (
    SELECT event 
    FROM table_name 
    WHERE start <= NOW() AND end >= NOW() 
    GROUP BY event 
); 

转换宏你会得到这样的:(未测试)

SELECT event,count(event) 
FROM table_name 
WHERE event NOT IN (
    SELECT event 
    FROM table_name 
    WHERE start <= GETDATE() AND end >= GETDATE() 
    GROUP BY event 
); 

这给你一个数,但也可以删除,count(event)部分。

这是输出我得到根据您提供的资料:

+----------+--------------+ 
| event | count(event) | 
+----------+--------------+ 
| Olympics |   3 | 
+----------+--------------+