2010-04-09 132 views
1

我看到这个局面堆栈溢出,但没有适合的MS-Access中的contect各种主题...SQL - 两个日期(非VBA)之间的查询范围

给定一个起始日期和结束日期,有没有一种方法可以通过SQL在时间范围内为每个给定的月份返回记录?

EG:

A record has a Start Date of #1/1/2010# and an End Date of #1/31/2010# 

Running the query against that single record, I would like the results to be 
      #1/4/2010# (Monday the 4th) 
      #1/11/2010# (Monday the 11th) 
      #1/18/2010# ...etc 
      #1/25/2010# 

限制

  • MS-Access 2003中:任何情况下/在SQL中环路(IIF语句都不错)
  • 这是一种观点而已,没有VBA会因为数据不会被篡改。断开连接的记录集是我最后的选择。我希望找到一些方法来调用SQL中的自定义函数以帮助返回这些值...某些类存储在全局范围内,而您在此日期范围内迭代时可能...

这可能吗?我看到很多不,但是如果有一种方法可以将值传递给函数,我可以找到一种方法来实现这个功能。可悲的是,我没有办法在不使用d/c记录集的情况下模拟存储过程,至少我知道......任何专家都知道某种方式?

+0

我很难理解这个问题。你的例子并没有多说 – 2010-04-09 22:17:10

+0

我明白你的意思了。不幸的是,我没有解决方案 – 2010-04-09 22:26:00

+0

它看起来像你已经关闭了不合适的所有方法,可以帮助你完成任务。我不知道如果你不打算以与你所说的不同的方式开展工作,任何人都无法帮助你。 – 2010-04-11 01:10:00

回答

1

你可以创建一个巨大的日历表,日期和日期。 4/12/10,星期一; 4月13日星期二,星期二等,然后查询结果的巨大表。你需要在过去和未来有多大的范围?尽管这是一个笨拙的解决方案,但它肯定会使查询变得干净和简单。

+0

我曾经想过在给定点上,我不知道是否它的大小会失控,直到理论上的时间结束,这取决于使用这种方法的应用程序的生命周期......我仍然未决定走这条路,但它肯定是一个很好的方法与最小的VBA使用,虽然我会有一个方法启动自动更新这张表随着时间的推移... – Mohgeroth 2010-04-11 01:07:40

+0

什么是项目的预期寿命?您可能会在未来十年更新它,所以请继续创建3600行的表格,并且这是十年的好时光。或者比它大10倍,这比项目的寿命,操作系统,开发环境等都要多。 – Knox 2010-04-11 17:34:08

+1

我们已经知道Windows在25世纪仍然在使用中,因为计算机上安全失败的频率很高星际迷航,所以它可能就是Access将被使用,然后... – 2010-04-12 19:37:31

0

您正在讨论一条查询,该查询会从一条记录中生成多个记录(每个日期一个)。我想这应该通过存储过程(如果您的数据库是SQL)或通过记录集。没有查询会做的伎俩。在需要的地方创建一个记录集并添加记录对我来说似乎很简单。你应该去做。

1

由于这可能与报告有关,所以您可以使用临时表方法,但这并不是很糟糕,尤其是如果您可能在给定时间段内运行多个报告(但请注意多个用户)。

现在,只是为了好玩,这里是一个超级难看,但半柔性的方法(使用表10项,适用于各种273年)

建立一个叫做T10有一个字段的表 - ID (使其长和主键),然后输入十行:0,1,2,3..9

SELECT #1/1/2010#+ 
     [t10].[ID]+ 
     [t100].[iD]*10+ 
     [t1000].[ID]*100+ 
     [t10000].[ID]*1000+ 
     [t100000].[iD]*10000 AS Mondays, 
FROM t10, 
    t10 AS t100, 
    t10 AS t1000, 
    t10 AS t10000, 
    t10 AS t100000 
WHERE Weekday(#1/1/2010#+ 
       [t10].[ID]+ 
       [t100].[iD]*10+ 
       [t1000].[ID]*100+ 
       [t10000].[ID]*1000+ 
       [t100000].[iD]*10000)=2; 

回报毕竟从星期一至2010-1-1 2283-10- 15并不像丑陋一样慢。 当然要得到问题的解决方案,您必须筛选字段date1和date2的结果。

实质上,这与临时表具有相同的解决方案,主要区别在于不必在每个查询上重建表。

你可以用只有一个表条目为0..99999来实现相同的结果,如果我要使用临时表,我可能会使用类似的东西。

0

我希望我能正确理解你的问题。为此,我们需要创建一个笛卡尔产品 - 所以你应该创建另一个表。它只需要一个ID,其中的数字从1到您的日期范围将包含的最长周数。

For example table: tCounter(CounterID int) 
CounterID 
1 
2 
3 
4 
etc.. 

测试数据我创建了一个模拟表数据

For example: tDates(DateID int, startdate datetime, enddate datetime) 
DateID, Startdate, EndDate 
1, 1/1/10  1/31/10 
2, 1/18/10  3/4/10 
3, 2/1/10  2/28/10 

,将产生的结果MSACCESS SQL语句类似于

SELECT tDates.DateID, ((7-Weekday([startdate],3))+[startdate])+(([CounterID]-1)*7) AS NewDay 
FROM tDates, tCounter 
WHERE (((((7-Weekday([startdate],3))+[startdate])+(([CounterID]-1)*7))<=[enddate])) 
ORDER BY tDates.DateID, ((7-Weekday([startdate],3))+[startdate])+(([CounterID]-1)*7); 

如果你想改变的日子从星期一到另一天,改变星期几功能的参数。 1=Sunday->7=Saturday

e.g. Weekday([startdate],3)...the 3=Tuesday so result is Monday 
e.g. Weekday([startdate],5)...the 5=Thursday so result is Wednesday 

希望对你有用。