我工作的事件重演应用。我有发言权的日期范围,2010 1月1日至12月31日2011年。我想回到所有的每个月的第三个星期四(任意)的,有效的。我可以在代码中做到这一点很平凡,需要提醒的是,它的必须的将在存储过程中完成的。最后,我想要的东西,如:

CALL return_dates(event_id);

这EVENT_ID具有1/1/2010一个start_date和的12/31/2011 END_DATE。结果集合将是这样的:

1/20/2010
2/14/2010
3/17/2010
4/16/2010
5/18/2010
etc. 

我只是好奇,这样做的最有效的方法是什么,考虑到我可能最终在我的实际使用量非常大的结果集。

有帮助吗?

解决方案

这涉及到一个想法 - 你可以创建一个表,并保存你感兴趣的有日期

其他提示

好吧,我没有测试过,但我认为这样做的最有效的方式是通过理货表,该表有一个数据库中的有用的东西呢:

IF EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[num_seq]') AND type in (N'U'))
DROP TABLE [dbo].[num_seq];

SELECT TOP 100000 IDENTITY(int,1,1) AS n
INTO num_seq
FROM MASTER..spt_values a, MASTER..spt_values b;

CREATE UNIQUE CLUSTERED INDEX idx_1 ON num_seq(n);

您可以使用这个来建立两个日期之间的时间范围。这是因为快 它只是使用索引(其实往往快于一环,所以我带领相信)

create procedure getDates
    @eventId int
AS
begin

declare @startdate datetime
declare @enddate datetime

--- get the start and end date, plus the start of the month with the start date in
select @startdate=startdate, 
       @enddate=enddate
       from events where eventId=@eventId

  select
         @startdate+n AS date,
       from
         dbo.num_seq tally
       where
        tally.n<datediff(@monthstart, @enddate) and
        Datepart(dd,@startdate+n) between 15 and 21 and
        Datepart(dw, @startdate+n) = '<day>'

除了获取开始和结束日期,第三个X ID每个月必须是15日和21日(含)之间。 在这个范围内各天的名称必须是唯一的,所以我们可以找到它立竿见影。

如果需要的第二个DAYNAME,只是适当地修改范围或使用的参数来计算它。

有使用开始日期,然后在添加天(通过在帐簿表号码的列表),直到它到达结束日期constucts日期表。

希望它能帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top