2009-04-17 2 views
1

Привет SQL гуру,запроса доступа (SQL) для возврата записей, отсортированных (сгруппированных по) неделям

Я не знаю, если вы можете мне помочь, но я буду стараться. У меня есть несколько крупных баз данных, сгруппированных по годам (каждый год в другой базе данных). Я хочу иметь возможность сравнивать значения с определенной недели с одного года на другой. Например, «покажите мне неделю 17 из 2008 по сравнению с неделей 17 из 2002 года».

У меня есть следующее определение недель, что в идеале я хотел бы использовать:

  1. Только 52 недель каждый год и 7 дней в неделю (что занимает всего 364 дней),
  2. Первый день первый неделя начинается со 2-го января - это означает, что мы не используем данные 1-го января, и
  3. В високосном году, в первый день первой недели также начинается со 2-го января, плюс мы пропускаем февраля 29.

Любой идентификатор EAS?

Заранее спасибо.

+0

У вас есть столбец «неделя»? –

+0

Нет, есть только поле «дата», с традиционным форматом dd/mm/yyyy. –

+0

Если это какая-то помощь, я использовал следующий sql, чтобы дать мне эквивалентное представление MONTHLY. В основном я хочу сделать то же самое, что и это, только в масштабе WEEKS вместо месяцев. –

ответ

2

Чтобы получить номер недели

'to get the week number in the year 
select datepart(week, datefield) 

'to get the week number in the month 
select (datepart(dd,datefield) -1)/7 + 1 

Вам не нужно усложнять думать о високосных годах и т.д. Просто сравните недели Несли на солнце

+0

Спасибо, я проверю это и посмотрю, что произойдет ... –

+0

Я перечитал ваш вопрос и добавил ответ на получение недели в году (с предыдущим вы получите номер недели в месяце) –

+0

ok , что важно - спасибо. –

1

Так как вы Хейвея в дефиниция, специфический о том, когда что стандарт, используемый db, я думаю, что таблица недель - это решение вашей проблемы. За каждый год создайте таблицу, которая определяет даты, содержащиеся в каждой неделе и номере недели. Затем путь присоединения к этой таблице, а также другим соответствующим таблицам, вы можете запросить только данные за неделю 17.

Table structure 
Date  Week 
20090102 1 
20090103 1 

т.д.

5

Лучше всего, чтобы избежать создания таблицы, потому что тогда вы должны обновить и поддерживать его, чтобы ваши запросы работали.

DatePart('ww',[myDate]) предоставит вам номер недели. Вы можете столкнуться с некоторыми проблемами, решив, какая неделя относится к тому году - например, если 1 января 2003 года в среду ли неделя принадлежит как неделя 52 в 2002 году или 1 неделя в 2003 году? У вашего бухгалтерии будет день недели, который будет вашим окончанием недели (обычно сб). Обычно я просто выбираю год, в котором больше всего дней. DatePart всегда будет считать первую неделю равной 1, а в случае примера выше прошлой недели - 53. Возможно, вам не все равно в любом случае. Вы можете создавать запросы за каждый год

а затем присоединяйтесь к запросам, чтобы получить ваши данные. Вы потеряете пару дней в конце года, если у одной таблицы 52 недели, а у нее 53 (большинство из них будут показаны как 53). Или вы можете сделать это в выходной день - это всегда дает вам субботу, которая продлится на поздней неделе в следующем году.

(7-Weekday([myDate]))+[myDate] 

затем

DatePart('ww',(7-Weekday([myDate]))+[myDate]) 

Надежда, что помогает

+0

«Лучше избегать создания таблицы, потому что вам нужно обновлять и поддерживать ее, чтобы ваши запросы работали». ДАТЬ СОГЛАСИЕ! –

0

мне нужно создать запрос, который показывает как год и номер недели, как 2014-52.Год показывает правильное значение, когда вы используете формулу Datepart(), чтобы перевести неделю 53 на 52-ю неделю в предыдущем году, но показывает неправильный год за неделю, которая была первой неделей, которая должна была быть на неделе 52 сейчас. Он показывает эту неделю как 2015-52 вместо 2014-52.

Кроме того, он сортирует данные неправильно, если вы используете только только номер недели, например:

2014-1,2014-11,2014-2

Для преодоления этого я создал следующий запрос вставьте 0, а также для проверки на дни недели 1, которые должны по-прежнему подпадать под неделю 52.

ActualWeek: IIf(DatePart("ww",[SomeDate],1,3)=52 And DatePart("ww",[SomeDate])=1, DatePart("yyyy",[SomeDate],1,3)-1,DatePart("yyyy",[SomeDate],1,3)) & "-" & IIf(DatePart("ww",[SomeDate],1,3)<10,"0" & DatePart("ww",[SomeDate],1,3),DatePart("ww",[SomeDate],1,3)) 
Смежные вопросы