Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新连续3天缺席的个人_Sql_Date - Fatal编程技术网

Sql 更新连续3天缺席的个人

Sql 更新连续3天缺席的个人,sql,date,Sql,Date,使用sql2005。我有三张桌子:会议、联系人和会议联系人 会议表包含以下字段:会议ID、会议名称、开始日期、地点 联系人有:联系人ID、姓名、姓氏、缺勤三天 会议联系人:会议ID,联系人ID 如果个人连续缺席三天(周末除外),我需要更新Missed_Three_Days字段 e、 g.如果他错过了星期五、星期一和星期二,那么“错过三天”字段将在星期二更新 这就是我目前所处的位置。。。我被where语句卡住了 update contacts set missed_three_days = 'M

使用sql2005。我有三张桌子:会议、联系人和会议联系人

会议表包含以下字段:会议ID、会议名称、开始日期、地点

联系人有:联系人ID、姓名、姓氏、缺勤三天

会议联系人:会议ID,联系人ID

如果个人连续缺席三天(周末除外),我需要更新Missed_Three_Days字段

e、 g.如果他错过了星期五、星期一和星期二,那么“错过三天”字段将在星期二更新

这就是我目前所处的位置。。。我被where语句卡住了

 update contacts set missed_three_days = 'Missed 3 Days' 
 where ID not in 

 (select contact_ID from MEETINGS_CONTACTS mc
  Join meetings m
 on m.id = mc.meeting_id
 join contacts c
 on c.id = mc.contact_ID
 where m.date_start  ???)
我有一种感觉很明显。。。但今天我的思想并没有指向那个方向


谢谢你的帮助

从臀部拍摄您可以创建一个功能,测试每次错过的会议是否有第二次,然后是同一个人的第三次会议。大概是这样的:

CREATE FUNCTION MissedThree
(
@pContact_ID int,
@pKeyDate Date
)
RETURNS Bit
AS
BEGIN

DECLARE @pReturnValue Bit = 0  /** FALSE UNTIL PROVEN OTHERWISE */

/** DID CONTACT MISS THIS MEETING? */
IF NOT Exists
    (SELECT Meetings.Meeting_ID FROM 
    Meeting_Contacts INNER JOIN Meetings 
    ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID
    WHERE Contact_ID = @pContact_ID AND Meetings.Date_Start = @pKeyDate)
BEGIN

    /** CHECK TO SEE IF NEXT WAS ALSO MISSED */

    DECLARE @pMeetingTwo Date       

    SELECT @pMeetingTwo = MAX(Date_Start) 
                FROM Meetings WHERE Date_Start > @pKeyDate;

    IF NOT Exists 
        (SELECT Meetings.Meeting_ID FROM 
        Meeting_Contacts INNER JOIN Meetings 
        ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID
        WHERE Contact_ID = @pContact_ID AND Meetings.Date_Start = @pMeetingTwo)
    BEGIN

       /** CHECKT TO SEE IF A THIRD CONSECUTIVE WAS MISSED */         

       DECLARE @pMeetingThree Date

       SELECT @pMeetingThree = MAX(Date_Start) 
                   FROM Meetings WHERE Date_Start > @pMeetingTwo;

       IF NOT Exists 
               (SELECT Meetings.Meeting_ID FROM 
               Meeting_Contacts INNER JOIN Meetings 
               ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID
               WHERE Contact_ID = @pContact_ID AND Meetings.Date_Start = @pMeetingThree)
        BEGIN         
           SET @pReturnValue = 1
        END
    END     

END 

RETURN @pReturnValue;

END
从那里你只需要运行一个查询来识别罪犯

SELECT Contact_ID, Start_Date FROM 
    Meeting_Contacts INNER JOIN Meetings 
        ON Meetings.Meeting_ID = Meeting_Contacts.Meeting_ID 
    WHERE dbo.MissedThree(Contact_ID, Start_Date) = 1
这里的好处是,它使用会议桌来确定会议的连续性。。。不是有问题的日历,如周末、节假日、非工作日等

我相信我能想出一个更优雅、更高效的解决方案,但你得给我更多的分数:。也许这至少能让你的创造力源源不断。许多人试图避免像瘟疫这样的功能


另外,您没有提到Sql版本,因此请注意,如果不是2008年,则需要将日期数据类型替换为DateTime。

我认为类似的内容可能会满足您的需要

   --select contacts who attended less than 3 of the last 3 meetings
    SELECT 
          contacts.contact_id,
          COUNT(meeting_contacts.meeting_id) as AttendedMeetings
    FROM contacts
    LEFT OUTER JOIN
    (     SELECT TOP 3 
               meetings.meeting_id
           FROM meetings
           ORDER BY meetings.date
    ) as Last3Meetings --the last 3 meetings and their attendees, regardless of when the meeting happened
      LEFT OUTER JOIN meeting_contacts
           ON meetings.meeting_id = meeting_contacts.meeting_id
           AND contacts.contact_id = meeting_contacts.contact_id
HAVING COUNT(contacts.meeting_id) < 3

快乐编码

如果其中一天没有开会怎么办?…是不是应该连续缺席三次会议?离今天还有三天,还是任何三天的间隔?如果有的话,是有固定的开始,还是从他们参加会议的第一天开始?谢谢你的提问。拉马克,你是对的,应该连续缺席三次会议,这也可以解释假期里不举行会议的原因。离“今天”还有三天。如果他们在第四天出席,我们会将missed_three_Concertive_meetings字段设置为空。