2010-02-18 1 views
6

Я уверен, что я пропустил что-то очень основное, но я не могу обернуть его вокруг себя после запроса и поиска в Интернете около часа.Получить недели в SQL

У меня есть уже существующий datetable, если это помогает. Он заселен датами последних лет и обновляется каждую ночь через хранимую процедуру, которая запускается заданием на сервере.

Что мне нужно сделать, так это тянуть понедельник-воскресенье, поэтому я могу правильно присоединиться к ним в таблице отслеживания, чтобы получить еженедельный хит-график. Я не хочу выписывать 52 постепенно более крупные предложения и объединять их по понятным причинам, и мне не нравится идея курсоров.

Я уже делал это месяцами и днями, но природа недель меня смущает по какой-то причине, или это по своей сути отличается.

Любые мысли о том, как автоматизировать процесс без курсоров или огромный выбор/объединение? Я пойду за курсором и сбрасываю его в стол ночью, если это абсолютно необходимо, но я надеюсь, что нет.

FYI мой желаемый формат в конце этого будет:

[Week number] | [StartDate] | [EndDate] 

За каждую неделю

+1

Что СУБД вы используете? –

+0

База данных Sql 2k5. В моей защите он помечен sql :) –

+3

@ C Bauer: В нашей защите SQL meas «Язык структурированных запросов», язык программирования баз данных: http://en.wikipedia.org/wiki/SQL :) –

ответ

8

Я мог бы быть от курса с тем, что Вы желаете, но это звучит, как вы хотите, этот вид вещи:

- eg кол-во записях, сгруппированных по неделям, за 2009

SELECT DATEPART(wk, DateField) AS WeekNumber, COUNT(*) AS HitsForWeek 
FROM SomeTable 
WHERE DateField >= '20090101' AND DateField < '20100101' 
GROUP BY DATEPART(wk, DateField) 
+0

Спасибо, это не то, что я хотел, но это привело меня на правильный путь! –

3

One добавленной вещь - ответ AdaTheDev является правильным, но по умолчанию это даст вам воскресенье через субботу неделю. Если вы хотите, с понедельника по воскресенье недели, вы должны выполнить

SET DATEFIRST 1

установить в первый день недели в понедельник (1). Вы можете запросить @@ DateFirst, чтобы узнать, какова ваша настройка - по умолчанию это 7 (воскресенье) в конфигурации на английском языке в США.

0

Возможно, вы предпочитаете использовать datediff(day, '19800107', yourDate)/7 (где 7 января-1980 - это известный понедельник), так что вам не нужно беспокоиться о том, когда система думает, что началась неделя. Кроме того, этот механизм очень легко адаптироваться к разным неделям, не учитывая значение @@DATEFIRST, просто выберите известное воскресенье или известный четверг или что-то еще.

1

Я тоже нашел недели, ниже приведен код, который я использую для преобразования даты в ее группу даты. Ниже приведены примеры, которые возвратят выходные или выходные дни в понедельник или неделю, не поддерживая поддерживающий стол. Вы также можете настроить их для использования в субботу и воскресенье, если это то, что вы хотите использовать.

--Returns the weekending (Friday) for a particular day 
SELECT DATEADD(day, -DATEPART(weekday,yourDate), yourDate)+6 

--Returns the week commencing (Monday) for a particular day 
SELECT DATEADD(day, -DATEPART(weekday,yourDate)+2, yourDate) 

Днем кодирования :)