2010-12-21 75 views
0

如何根据Access中两个不同日期之间的星期列表创建一个查询来分解计数频率?如何创建访问周数列表?

目前我在t-sql中有以下代码,但希望在Access中运行它。

declare @fromdate smalldatetime 
declare @todate smalldatetime 
declare @toptr smalldatetime 
declare @fromptr smalldatetime 

set @fromdate = '1/11/2010' 
set @todate = '27/12/2010' 

set @fromptr = dateadd(dd,1 - datepart(weekday,@fromdate), @fromdate) 

while @fromptr < @todate 
begin 
    print 'from: ' + cast(@fromptr as nvarchar) + ' --> ' + cast(@toptr as nvarchar) 
    set @fromptr = dateadd(dd,7, @fromptr) 
    set @toptr = dateadd(dd,7, @fromptr) 
    insert into @weeks values (@fromptr, @toptr) 
end 

我想以某种方式绑定一些有大量日期的行,并根据表变量中创建日期的每周'结束日期'聚合它们。访问似乎不允许这种sql查询,所以想知道是否有另一种方式做到这一点: 1)或者根本不使用中间表,2)和/或将上面的代码转换为访问兼容

回答

1

这将按星期(从周日开始)分组,并且比其他日期计算方法(如DateAdd,DateDiff,DatePart和Format)更快。

SELECT 
    CDate((([DateColumn] - 1) \ 7) * 7 + 1) AS WeekStartingDate, 
    Sum([OrderCount]) AS SumOfOrders 
FROM 
    Orders 
GROUP BY 
    CDate((([DateColumn] - 1) \ 7) * 7 + 1); 

如果你想看到本周结束日期,到了最后,而不是1加7 GROUP BY表达式可以或许只是([DateColumn] - 1) \ 7,但我不知道。

反斜杠执行整数除法,除以7将一个星期的日期转换为单个整数,-1调整“零日期”是星期六而不是星期天的事实。要使用一周中不同的开始日期,请将-1和+1调整为相同的金额。例如,要使用星期一,它将是-2和+2。

这是语言和地区独立的依赖于VB的日期内部表示为数字。

0

的纯香草解决方案是引入一个Calendar表可能看起来像

Calendar 
------------------------ 
FullDate   date 
CalendarYear  integer 
DayNumberInWeek integer 
DayNumberInMonth integer 
DayNumberInYear integer 
DayNumberInEpoch integer 
WeekNumberInYear integer 
WeekNumberInEpoch integer 
MonthNumberInYear integer 
MonthNumberInEpoch integer 
... and many more that you may need to group by 

然后,如果你甲肝Ë表计数器

Counters 
----------- 
FullDate date 
Value  integer -- cumulative for one day 

您可以:

select 
    WeekNumberInYear 
    , sum(Value) 
from Calendar as a 
join Counters as b on b.FullDate = a.FullDate 
where CalendarYear = 2010 
group by WeekNumberInYear ; 

最简单的方法来填充Calendar是花费在Excel中一些时间,建立10 - 20年值得行,只是在DB进口。

这里没有具体的访问,但希望你明白了。