1

Fullcalender で繰り返し発生するイベントの問題を修正するために、数日間探していました。最も簡単な方法は、テーブルに保存されているデータに基づいて定期的な日付を生成することです。

過去に CTE クエリを使用したことはありません。私が必要とするのは、日の例の定期的な日付を生成することです

毎週月曜日と木曜日にオフィスでプロジェクトのミーティングを行います。この場合、開始日 = 2012-06-04 終了日 = 2012-06-31 とします。

ここで、2012 年 6 月 4 日から 2012 年 8 月 31 日までのすべての日付を表示する SQL クエリを生成したいと考えています。

EventID     Date          Title
1          2012-06-04     Project Meeting
1          2012-06-07     Project Meeting
1          2012-06-11     Project Meeting
1          2012-06-14     Project Meeting
1          2012-06-18     Project Meeting
1          2012-06-21     Project Meeting
1          2012-06-25     Project Meeting
1          2012-06-18     Project Meeting
2          2012-05-13     Meeting With Client
3          2012-06-25     Event 3

これを達成する方法を理解できました。これについて助けていただければ幸いです。または、同様の例を教えてください。このデータを正しく生成できれば、これらの日付を eventTitle とともに FullCalender コントロールに送信して、以下の例に示すようにイベントのカレンダーを表示できますhttp://arshaw.com/fullcalendar/

誰かが喜んで手伝ってくれれば、以下の sql からテーブルとサンプル データを作成できます。これは、MS SQL 2008 でのみサポートされているデータ型を使用しているため、MS SQL SERVER 2008 r2 と互換性があります。

データを含むスキーマ

/****** Object:  Table [dbo].[EventCalender]    Script Date: 05/24/2012 20:18:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[EventCalender](
    [EventID] [int] IDENTITY(1,1) NOT NULL,
    [EventTitle] [nvarchar](900) NULL,
    [EventDetails] [nvarchar](max) NULL,
    [EventStartDate] [date] NOT NULL,
    [EventEndDate] [date] NULL,
    [EventStartTime] [time](0) NULL,
    [EventEndTime] [time](0) NULL,
    [EventRecurring] [bit] NULL,
    [EventEnumDays] [varchar](50) NULL,
    [EventBlockDate] [bit] NULL,
    [EventVisibleOnWebsite] [bit] NULL,
    [EventActive] [bit] NULL,
    [EventType] [nvarchar](200) NULL,
    [LanguageID] [int] NOT NULL,
    [EventCreatedOn] [date] NULL,
    [EventShowTime] [bit] NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
SET IDENTITY_INSERT [dbo].[EventCalender] ON
INSERT [dbo].[EventCalender] ([EventID], [EventTitle], [EventDetails], [EventStartDate], [EventEndDate], [EventStartTime], [EventEndTime], [EventRecurring], [EventEnumDays], [EventBlockDate], [EventVisibleOnWebsite], [EventActive], [EventType], [LanguageID], [EventCreatedOn], [EventShowTime]) VALUES (1, N'Project Meeting', N'Every Monday, Thrusday', CAST(0xC1350B00 AS Date), CAST(0x19360B00 AS Date), CAST(0x00A08C0000000000 AS Time), CAST(0x00B8A10000000000 AS Time), 1, N'2,5,7', 0, 0, 1, N'EVENT', 1, CAST(0xB6350B00 AS Date), NULL)
INSERT [dbo].[EventCalender] ([EventID], [EventTitle], [EventDetails], [EventStartDate], [EventEndDate], [EventStartTime], [EventEndTime], [EventRecurring], [EventEnumDays], [EventBlockDate], [EventVisibleOnWebsite], [EventActive], [EventType], [LanguageID], [EventCreatedOn], [EventShowTime]) VALUES (2, N'Meeting With Client', N'Event Details 2', CAST(0xBA350B00 AS Date), CAST(0xBA350B00 AS Date), NULL, NULL, 0, NULL, 0, 0, 1, N'EVENT', 1, CAST(0xB6350B00 AS Date), NULL)
INSERT [dbo].[EventCalender] ([EventID], [EventTitle], [EventDetails], [EventStartDate], [EventEndDate], [EventStartTime], [EventEndTime], [EventRecurring], [EventEnumDays], [EventBlockDate], [EventVisibleOnWebsite], [EventActive], [EventType], [LanguageID], [EventCreatedOn], [EventShowTime]) VALUES (3, N'Event 3', N'Event Details 3', CAST(0xAB350B00 AS Date), CAST(0xAB350B00 AS Date), NULL, NULL, 0, NULL, 0, 0, 0, N'EVENT', 1, CAST(0xB6350B00 AS Date), 0)
INSERT [dbo].[EventCalender] ([EventID], [EventTitle], [EventDetails], [EventStartDate], [EventEndDate], [EventStartTime], [EventEndTime], [EventRecurring], [EventEnumDays], [EventBlockDate], [EventVisibleOnWebsite], [EventActive], [EventType], [LanguageID], [EventCreatedOn], [EventShowTime]) VALUES (5, N'Weekly Meeting', N'Weekly Event', CAST(0xA3350B00 AS Date), CAST(0x01380B00 AS Date), CAST(0x00D0B60000000000 AS Time), NULL, 1, N'2,', 0, 1, 1, N'ACTIVITY', 2, NULL, 0)
SET IDENTITY_INSERT [dbo].[EventCalender] OFF
/****** Object:  Default [DF_EventCalender_EventEndDate]    Script Date: 05/24/2012 20:18:00 ******/
ALTER TABLE [dbo].[EventCalender] ADD  CONSTRAINT [DF_EventCalender_EventEndDate]  DEFAULT (NULL) FOR [EventEndDate]
GO
/****** Object:  Default [DF_EventCalender_EventStartTime]    Script Date: 05/24/2012 20:18:00 ******/
ALTER TABLE [dbo].[EventCalender] ADD  CONSTRAINT [DF_EventCalender_EventStartTime]  DEFAULT (NULL) FOR [EventStartTime]
GO
/****** Object:  Default [DF_EventCalender_EventEndTime]    Script Date: 05/24/2012 20:18:00 ******/
ALTER TABLE [dbo].[EventCalender] ADD  CONSTRAINT [DF_EventCalender_EventEndTime]  DEFAULT (NULL) FOR [EventEndTime]
GO
/****** Object:  Default [DF_EventCalender_EventRecurring]    Script Date: 05/24/2012 20:18:00 ******/
ALTER TABLE [dbo].[EventCalender] ADD  CONSTRAINT [DF_EventCalender_EventRecurring]  DEFAULT ((0)) FOR [EventRecurring]
GO
/****** Object:  Default [DF_EventCalender_EventEnumDays]    Script Date: 05/24/2012 20:18:00 ******/
ALTER TABLE [dbo].[EventCalender] ADD  CONSTRAINT [DF_EventCalender_EventEnumDays]  DEFAULT (NULL) FOR [EventEnumDays]
GO
/****** Object:  Default [DF_EventCalender_EventBlockDate]    Script Date: 05/24/2012 20:18:00 ******/
ALTER TABLE [dbo].[EventCalender] ADD  CONSTRAINT [DF_EventCalender_EventBlockDate]  DEFAULT ((0)) FOR [EventBlockDate]
GO
/****** Object:  Default [DF_EventCalender_EventVisibleOnWebsite]    Script Date: 05/24/2012 20:18:00 ******/
ALTER TABLE [dbo].[EventCalender] ADD  CONSTRAINT [DF_EventCalender_EventVisibleOnWebsite]  DEFAULT ((0)) FOR [EventVisibleOnWebsite]
GO
/****** Object:  Default [DF_EventCalender_EventActive]    Script Date: 05/24/2012 20:18:00 ******/
ALTER TABLE [dbo].[EventCalender] ADD  CONSTRAINT [DF_EventCalender_EventActive]  DEFAULT ((0)) FOR [EventActive]
GO
/****** Object:  Default [DF_EventCalender_EventShowTime]    Script Date: 05/24/2012 20:18:00 ******/
ALTER TABLE [dbo].[EventCalender] ADD  CONSTRAINT [DF_EventCalender_EventShowTime]  DEFAULT ((0)) FOR [EventShowTime]
GO
4

1 に答える 1

2

これにより、CTEを使用して定期的な日付を作成する方法の開始点が得られる場合があります。

;with Dates as (
    select cast('2012-06-04' as date) as StartDate, cast('2012-08-31' as date) as EndDate
),
RecursiveCTE as (
    select StartDate, EndDate, StartDate as EventDate
    from Dates
    union all
    select StartDate, EndDate, dateadd(dd, 7, EventDate)
    from RecursiveCTE
    where dateadd(dd, 7, EventDate) < Enddate
)
select * from RecursiveCTE

アップデート

スキーマと挿入を使用して、目的の結果をもたらす再帰CTEを次に示します。

;with Calendar as (
    select EventID, EventTitle, EventStartDate, EventEndDate, EventEnumDays, EventRecurring, EventStartDate as PlannedDate
    from EventCalender
    where EventActive = 1
    union all
    select EventID, EventTitle, EventStartDate, EventEndDate, EventEnumDays, EventRecurring, dateadd(dd, 1, PlannedDate)
    from Calendar
    where EventRecurring = 1
        and dateadd(dd, 1, PlannedDate) <= EventEndDate
)
select EventID, PlannedDate as [Date], EventTitle
from Calendar
where ',' + EventEnumDays + ',' like '%,' + cast(datepart(dw, PlannedDate) as char(1)) + ',%'
    or EventEnumDays is null
order by EventID, PlannedDate
option (maxrecursion 0)

ここでは毎週のイベントを「曜日」(dw)に依存しているため、月次または年次のイベントを含める場合は、いくつかの変更(場合によってはケース/スイッチ)を行う必要があることに注意してください。

また、再帰CTEは、カウントの最も遅い方法の1つである可能性があります。これは、基本的にここで行っていることです。速度が最優先される場合は、集計テーブルの方が適している場合があります。

于 2012-05-24T12:52:43.370 に答える