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
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top