检查(并防止)重复的日期/时间条目

时间:2018-01-23 20:01:08

标签: c# sql time asp.net-core-mvc

我正在开展加入SportEvent的项目,我希望用户在创建活动时使用EventStart类型输入EventEndDateTime。当用户尝试在已选择的DateTime值中创建事件时,我想禁止用户创建新事件。

以下是一些截图:

SportEventController中的方法

img

SportEvent的属性

img2

.cshtml用于设置DateTime

img3

这些值保存在SQL数据库中,我想检查现有DateTimeEventStart

之间是否有新的EventEnd

3 个答案:

答案 0 :(得分:1)

创建新事件时,您可以使用(pseudo-sql)搜索重叠日期的现有事件:

Select * from events e where EventStart < @end and EventEnd > @start 

@start和@end是新活动的日期。如果查询给出结果,则意味着期间至少部分重叠,然后只是阻止新事件的创建。

更新:如果another answer有疑问,这个SQL会帮助您获得部分或完全覆盖时间跨度的情况,无论如何。花点时间在纸上模拟不同的案例,这样就可以解决这个问题。

答案 1 :(得分:1)

我发现问题已从SQL查询更改为发现冲突,将它们放在代码中并对其进行操作。

我不确定BadRequest和Ok做了什么,你错过了一个代码层。但是你应该在你的ajax或php或其他任何调用中成功处理和处理错误 你的行动结果方法。我建议您在失败时根据失败原因向用户提供有意义的警报。所以如果是时间表冲突 他们可以更改计划信息,如果他们缺少可以填写的数据元素,或者如果保存失败,您可以以有意义的方式处理它。

看看这是否有助于您朝着正确的方向前进:

[HttpPost]
public IActionResult DoNotNameItPost([FromBody] SportEvent sportEvent)
{
    if(sportEvent != null)
    {
        // you should probably just have 1 of these for your controller but we'll use local instantiation for the example
        SportEventService ses = new SportEventService();

        // your service should have a db connection that simply gets all your sportevents.
        // I would recommend having a where clause that eliminates events that have already happend
        // from the result set.  thus "upcoming" instead of "existing" events
        List<SportEvent> upcomingEvents = ses.GetUpcomingEventsToList();

        bool conflict = false;

        foreach(SportEvent se in upcomingEvents)
        {
            // logic:  if the new BEGINS before existing ENDS
            // OR new ENDS AFTER existing BEGINS there is a conflict
            // OR if the new event completely encompasses an existing one
            if( (sportEvent.EventStart < se.EventEnd) || (sportEvent.EventEnd > se.EventStart) || (sportEvent.EventStart < se.EventStart && sportEvent.EventEnd > se.EventEnd) )
            {
                conflict = true;
                // break if you find 1 conflict, no need to find more than 1
                break;
            }
        }

        // success condition
        if(!conflict)
        {
            // try to perform your save
            if(_sportEventManager.Save(sportEvent))
            {
                return Ok(sportEvent);
            }
            else
            {
                BadRequest("Save failed");
            }

        }
        // fail condition
        else
        {
            return BadRequest ("Schedule Conflict");
        } 
    }
    else
    {
         return BadRequest ("Invalid SportEvent Data");
    }
}

@Cas de Pender 我不确定我是否理解你所要求的确切内容 您在问题中显示的代码中缺少的是3折 一:你在cshtml上缺少某种动作。
二:该操作将直接转到控制器或利用php或javascript执行ajax调用 三:如何处理您的回复。 ajax调用应该通过您的新体育赛事,并期望收到成功或错误的消息。根据上面的代码。

你需要帮助吗?或者只是过滤的逻辑,如果结果有计划冲突?或两者兼而有之?

此处提供的答案是关于识别您的日程安排冲突。如果你需要帮助从你的.cshtml到你的ajax到你的控制器,然后收到响应并采取行动,这是一个单独的问题。

这是一个非常简单的例子,不使用javascript,php或ajax。如果这是您的问题,您可能希望制作一个新问题,并明确这是您要问的问题。 How do i send data to asp.net controller so that it can return a view?

我强烈建议您查找一个cshtml教程并完成这些步骤。一旦看到模式,您就可以将其移动到您的应用程序中,每次需要时都会更有意义。

答案 2 :(得分:0)

previous answer发布的问题是,只有在新事件完全包含在现有事件的时间范围内时,它才会返回。

尝试改为:

SELECT * FROM Events WHERE ((newStart BETWEEN Start AND End) OR (newEnd BETWEEN Start AND End)) OR (newStart < Start AND newEnd > End)

如果您想真正喜欢,可以使用现有事件将日历加载到UI中。这可能会强制您的用户选择一个尚未选择的时间,从而完全阻止检查(以及防止必须返回“错误 - 已在使用中的时间”和“请再试一次”消息给您的用户)。