2010-02-18 9 views
6

Sono certo che sto trascurando qualcosa di molto semplice qui, ma non riesco a capirlo intorno dopo aver interrogato e googling per circa un'ora.Ottenere settimane in SQL

Ho un datario già esistente, se questo aiuta. È popolato con le date degli anni passati e viene aggiornato ogni notte tramite un processo memorizzato che viene eseguito da un lavoro sul server.

Quello che devo fare è tirare fuori le settimane da lunedì a domenica in modo che possa unirmi a un tavolo di monitoraggio per ottenere un grafico di successo settimanale. Non voglio scrivere 52 affermazioni di selezione gradualmente più grandi e unirle per ovvi motivi, e non mi piace l'idea dei cursori.

Ho già fatto questo con mesi e giorni, ma la natura delle settimane mi confonde per qualche motivo, o è intrinsecamente diverso.

Qualche idea su come automatizzare il processo senza cursori o un'enorme selezione/unione? Vado per il cursore e lo metto su un tavolo ogni notte, se assolutamente necessario, ma spero di no.

FYI mio formato desiderato, alla fine di esso sarebbe:

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

Per ogni settimana

+1

Cosa DBMS stai usando? –

+0

Il database è Sql 2k5. A mia difesa è taggato sql :) –

+3

@C Bauer: A nostra difesa, SQL meas "Structured Query Language", un linguaggio di programmazione del database: http://en.wikipedia.org/wiki/SQL :) –

risposta

8

potrei essere fuori rotta con quello che hai intenzione, ma suona come si desidera che questo tipo di cosa:

- ad esempio conteggio dei record raggruppati per settimana, per 2009

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

Grazie, è non quello che volevo ma mi ha fatto sulla strada giusta! –

3

Una cosa aggiunto - la risposta di AdaTheDev è giusto, ma per difetto vi darà Domenica a sabato settimane. Se si desidera Lunedi a Domenica settimane, è necessario eseguire

SET DATEFIRST 1

per impostare il primo giorno della settimana a Lunedi (1). Puoi interrogare @@ DateFirst per vedere quali sono le tue impostazioni - per impostazione predefinita è 7 (domenica) nella configurazione inglese degli Stati Uniti.

0

Si potrebbe preferire usare datediff(day, '19800107', yourDate)/7 (dove 7 gennaio 1980 è noto lunedì), in modo che non ci si debba preoccupare di quando il sistema pensa che sia iniziata una settimana. Inoltre, questo meccanismo è molto facile da adattare a diverse settimane senza dover considerare il valore di @@DATEFIRST, basta scegliere una domenica conosciuta o un giovedì conosciuto o altro.

1

Anche io ho trovato settimane difficili, di seguito è riportato il codice che uso per convertire una data nel relativo gruppo della settimana. Di seguito sono riportati alcuni esempi che restituiranno il week-end venerdì o la settimana che inizia il lunedì senza dover mantenere un tavolo di supporto. Puoi anche regolarli per usare sabato e domenica se è quello che vuoi usare.

--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) 

Felice di codifica :)

Problemi correlati