Запрос доступа (SQL) для возврата записей, отсортированных (сгруппированных по) НЕДЕЛЯМ - PullRequest
1 голос
/ 18 апреля 2009

Привет SQL гуру,

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

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

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

Есть идеи?

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

Ответы [ 4 ]

5 голосов
/ 18 апреля 2009

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

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

SELECT DatePart('ww',[myDate]) as WeekNumber,myYearTable.* as WeekNumber 
FROM myYearTable

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

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

тогда

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

Надеюсь, это поможет

2 голосов
/ 18 апреля 2009

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

 '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

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

1 голос
/ 18 апреля 2009

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

Table structure
Date      Week
20090102   1
20090103   1

и т.д.

0 голосов
/ 21 января 2015

Мне нужно было создать запрос, который показывает ОБА номера года и недели, например, 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...