Raggruppamento intervallo di date per settimana
-
06-09-2019 - |
Domanda
Ho un intervallo di date in cui una data di inizio è di 2 anni prima di oggi. per esempio) '05 / 29 / 2007' ~ '05 / 29 / 2009' .
Come posso rompere sopra intervallo di date in modo che avrei ricevuto una lista come la seguente?
(data di inizio inizia con "2007/05/27", non "2007/05/29" dall'inizio della settimana è Domenica e '05 / 27 / 2007' è il primo giorno della settimana per il '05 / 29 / 2007' e lo stesso ragionamento per l'ultimo DataFine, 2009/05/30, che è Sabato)
StartDate EndDate
05/27/2007 06/02/2007
06/03/2007 06/09/2007
...
05/24/2009 05/30/2009
[UPDATE] qui è la mia domanda finale
WITH hier(num, lvl) AS (
SELECT 0, 1
UNION ALL
SELECT 100, 1
UNION ALL
SELECT num + 1, lvl + 1
FROM hier
WHERE lvl < 100
)
SELECT num, lvl,
DATEADD(dw, -DATEPART(dw, '2007-05-29'), '2007-05-29') + num * 7,
DATEADD(dw, -DATEPART(dw, '2007-05-29'), '2007-05-29') + (num + 1) * 7
FROM hier
where num <= 104 --; 52 weeks/year * 2
ORDER BY num
Soluzione
WITH hier(num, lvl) AS (
SELECT 0, 1
UNION ALL
SELECT 100, 1
UNION ALL
SELECT num + 1, lvl + 1
FROM hier
WHERE lvl < 100
)
SELECT DATEADD(dw, -DATEPART(dw, '29.05.2007'), '29.05.2007') + num * 7,
DATEADD(dw, -DATEPART(dw, '29.05.2007'), '29.05.2007') + (num + 1) * 7
FROM hier
WHERE DATEADD(dw, -DATEPART(dw, '29.05.2007'), '29.05.2007') + num * 7 < '29.05.2009'
ORDER BY
num
Questo genererà un set di righe con gli intervalli necessari.
Altri suggerimenti
È necessario fare in modo che @@ DATEFIRST sia correttamente inviato, allora si può semplicemente utilizzare il codice qui sotto. Leggi su DATEFIRST anche se così che si capisce pienamente.
SET DATEFIRST 1
DECLARE @my_date DATETIME
SET @my_date = '2007-05-29'
SELECT
DATEADD(dw, -DATEPART(dw, @my_date), @my_date) AS StartDate,
DATEADD(dw, 6 - DATEPART(dw, @my_date), @my_date) AS EndDate
Dovrebbe essere abbastanza semplice directy nell'istruzione SQL ... Ho avuto una lunga storia di trattare con date e data l'aritmetica, quindi vorrei affrontare qualcosa di simile:
select
datepart( year, YourDateField ) as GroupYear,
datepart( week, ( YourDateField - datepart( day, YourDateField ) +1 ) as GroupWeek,
YourDateField,
OtherFields
from
YourTable
where
whateverDateRange...
group by
GroupYear,
GroupWeek
La ragione per l'anno e la settimana è se si estendono su più anni, si avrebbe settimana 1 dei due anni prima settimana 2 del primo anno, etc ..
Ora, come funziona la matematica ... per il GroupWeek. Questo effettivamente calcolare il primo giorno della settimana, in base a ciò che la data di dati ha come base ... Diciamo che sono i dati per il 25 maggio, 26, 27 quest'anno ... Sarebbero rispettivamente il 2 °, 3 ° e 4 ° giorno della settimana - essendo Domenica inizia la settimana al giorno 1. Quindi:
25-2 Maggio (giorno della settimana) = 23 maggio (Sabato) + 1 = 24 maggio (Domenica della settimana). 26 maggio - 3 (giorno della settimana) = 23 maggio ... ecc 27 maggio - 4 (giorno della settimana) = 23 maggio
Quindi, includendo anche il campo data originale in questione, si può vedere la vera data troppo tutto in una chiamata SQL ...