如何创建访问周数列表?

时间:2010-12-21 17:24:35

标签: sql ms-access

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

目前我在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

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

3 个答案:

答案 0 :(得分: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而不是1. GROUP BY表达式可能只是([DateColumn] - 1) \ 7但是我不确定。

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

这是语言和地区独立,取决于VB的日期内部数字表示。

答案 1 :(得分:0)

您可以在Access查询中使用格式:http://msdn.microsoft.com/en-us/library/aa159657(v=office.10).aspx

SELECT Format(Date,"ww") FROM Table
GROUP BY Format(Date,"ww")

答案 2 :(得分: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年的行,然后只需导入数据库。

此处没有特定于Access的内容,但希望您明白这一点。