2010-12-21 45 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進口。

這裏沒有具體的訪問,但希望你明白了。