1

我看到有关堆栈溢出的各种主题,但没有一个适合 MS-Access 的...

给定一个开始日期和一个结束日期,有没有办法通过 SQL 返回时间范围内每个给定月份的记录?

例如:

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 中的自定义函数以帮助返回这些值...当您遍历此日期范围时,某些类可能存储在全局范围内...

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

4

4 回答 4

1

您可以创建一个巨大的日历表,其中包含日期和日期。2010 年 4 月 12 日,星期一;2010 年 4 月 13 日、星期二等。然后查询该巨型表以获取结果。过去和未来需要多大的范围?尽管这是一个笨拙的解决方案,但它肯定会使查询变得简洁明了。

于 2010-04-10T10:14:10.763 回答
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 的表来获得相同的结果,如果我要使用临时表,我可能会使用类似的东西。

于 2010-04-12T15:31:01.563 回答
0

您正在谈论从一条记录中生成多条记录(每个日期一条)的查询。我想这应该通过存储过程(如果您的数据库是 SQL)或通过记录集来完成。没有查询可以解决问题。创建记录集并在需要的地方添加记录对我来说似乎很简单。你应该去争取。

于 2010-04-10T10:54:50.723 回答
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);

如果要将日期从星期一更改为另一天,请更改 weekday 函数中的参数。 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 

希望这对你有用。

于 2010-04-12T22:44:52.347 回答