Как я могу создать список недель в доступе? - PullRequest
0 голосов
/ 21 декабря 2010

Как мне создать запрос, который разбивает частоту подсчетов на основе списка недель между двумя разными датами в 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) и / или преобразовав вышеприведенный код в совместимый доступ

Ответы [ 3 ]

1 голос
/ 22 декабря 2010

Это сгруппирует по неделям (начиная с воскресенья) и будет быстрее, чем другие методы вычисления даты, такие как 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);

Если вы хотите увидеть дату окончания недели, добавьте7 в конце вместо 1. Выражение GROUP BY, вероятно, может быть просто ([DateColumn] - 1) \ 7, но я не уверен.

Обратная косая черта выполняет целочисленное деление, деление на 7 превращает неделю дат в одно целоеи -1 корректирует тот факт, что «нулевой датой» является суббота, а не воскресенье.Чтобы использовать другой начальный день недели, настройте -1 и +1 на одинаковую величину.Например, для использования понедельника это будет -2 и + 2.

Это не зависит от языка и региона в зависимости от внутреннего представления дат в VB чисел.

0 голосов
/ 21 декабря 2010

Простое ванильное решение состоит в том, чтобы ввести таблицу 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

Тогда, если у вас есть таблица Counter

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 здесь нет, но надеюсь, что вы поняли.

0 голосов
/ 21 декабря 2010

Вы можете использовать Формат в запросах доступа: http://msdn.microsoft.com/en-us/library/aa159657(v=office.10).aspx

SELECT Format(Date,"ww") FROM Table
GROUP BY Format(Date,"ww")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...