SQL - 两个日期之间的查询范围(NON-VBA)

时间:2010-04-09 22:02:59

标签: sql ms-access date-range

我在堆栈溢出周围看到了各种主题但没有一个符合MS-Access的含义...

考虑到开始日期和结束日期,是否有办法在时间范围内通过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中没有Case / Loops(IIF语句很好)
  • 这只是一个视图,因为数据不会被篡改,所以不会使用任何VBA。断开连接的记录集是我的最后一个选择。我更愿意找到一些方法来调用SQL中的自定义函数来帮助返回这些值...当你遍历这个日期范围时,某些类存储在全局范围内...

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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,你可以获得相同的结果,如果我要使用临时表,我可能会使用类似的东西。

答案 2 :(得分:0)

您所说的是一个查询,它会从单个记录中生成多个记录(每个日期一个)。我想这应该通过存储过程(如果您的数据库是SQL)或通过记录集进行。没有查询可以做到这一点。创建记录集并在需要的地方添加记录对我来说非常简单。你应该去做吧。

答案 3 :(得分: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 

希望对你有用。