我在堆栈溢出周围看到了各种主题但没有一个符合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#
限制
这可能吗?我看到很多没有,但是如果有办法将值传递给函数,我可以找到一种方法来实现这个功能。很遗憾,我没有办法在不使用d / c记录集的情况下模拟存储过程,至少我知道......任何专家都知道这种方法吗?
答案 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
希望对你有用。