查找两个日期之间的重复活动

时间:2017-07-03 09:58:16

标签: sql-server calendar date-range

我的任务是为一个将由SQL Server支持的网站创建一个事件日历。使用以下列出的一些信息:Calendar Recurring/Repeating Events - Best Storage Method我在数据库中创建了两个表;

CREATE TABLE [Calendar].[Event](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](100) NOT NULL,
    [Details] [nvarchar](max) NOT NULL,
    [EventType] [int] NOT NULL,
    [Dismissable] [bit] NOT NULL DEFAULT ((1)),
    [Created] [datetime2](7) NOT NULL DEFAULT (getdate()),
    [CreatedBy] [uniqueidentifier] NOT NULL,
    [LastEdited] [datetime2](7) NOT NULL DEFAULT (getdate()),
    [EditedBy] [uniqueidentifier] NOT NULL
)

CREATE TABLE [Calendar].[EventSchedule](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [EventId] [int] NOT NULL,
    [StartDate] [datetime2](7) NOT NULL,
    [EndDate] [datetime2](7) NULL,
    [IntervalDays] [int] NULL,
    [IntervalWeeks] [int] NULL,
    [IntervalMonths] [int] NULL,
    [IntervalYears] [int] NULL,
    [WeekDayNumber] [int] NULL,
    [MonthWeekNumber] [int] NULL,
    [YearMonthNumber] [int] NULL
)

我现在正在尝试编写一个存储过程来捕获落在日期范围之间的所有事件(单数和重复),但是无法解决所有不涉及生成临时表或游标的解决方案。< / p>

我当前的包版广告是每 n 天重复发生的事件。到目前为止,我有以下内容:

CREATE PROCEDURE Calendar.GetEventsForDateRange
@StartDateRange DATETIME2
@EndDateRange DATETIME2

AS
BEGIN

SELECT * --for brevity
FROM Calendar.EventSchedule
WHERE (StartDate <= @EndDateRange
AND DATEDIFF(DAY, StartDate, @EndDateRange) / IntervalDays >= 1)
OR (StartDate >= @StartDateRange AND StartDate <= @EndDateRange)

END

我有一个StartDate = 2017-07-02和IntervalDays = 7的事件。如果我传递了@StartDateRange = 2017-07-03和@EndDateRange = 2017-07-09,则会正确返回该事件。如果我然后更改@StartDateRange = 2017-07-13和@EndDateRange = 2017-07-15,则仍会返回该事件,其下一次出现的时间应为2017-07-16。

如何更改/修改当前存储过程以返回仅在日期范围内发生的事件?

对此的任何帮助将不胜感激。

0 个答案:

没有答案