Giocando con il Data Ora in SQL Server
-
09-10-2019 - |
Domanda
Sto costruendo un rapporto di SSRS.
Nel rapporto, la settimana corre sempre da Lunedi -. Domenica
E voglio scoprire la date di inizio e fine della prima di due settimane.
Ad esempio,
Se la data corrente = 1 gennaio 2011
- settimana corrente = 27 dicembre, 2010 a 2 gennaio 2011
- precedente settimana = 20 Dicembre 2010 al 26 Dicembre 2010
Ho provato quanto segue, ma sembra che non riesce quando quando giorno corrente = Domenica
DECLARE @DT DATETIME
DECLARE @Offset INT
DECLARE @CM DATETIME
DECLARE @PM DATETIME
DECLARE @PS DATETIME
--SET @DT = GETDATE()
SET @DT = '11/14/2010' -- Monday
SET @Offset = (DATEPART(WEEKDAY, @DT) - 2) * -1
SET @CM = DATEADD(DAY, @Offset, @DT)
SET @PM = DATEADD(DAY, -7, @CM)
SET @PS = DATEADD(DAY, -1, @CM)
SELECT @Offset AS Offset, @DT AS Date, @CM AS Monday, @PM AS [Previous Monday], @PS AS [Previous Sunday], DATEPART(WK, @PM) AS Week
Come posso risolvere il problema?
Soluzione
Non sono sicuro se questa è la soluzione più elegante, ma si potrebbe fare una dichiarazione caso con il vostro @Offset in questo modo:
SET @offset = CASE WHEN DATEPART(weekday, @today) >= 2
THEN -(DATEPART(weekday, @today) - 2)
ELSE -(DATEPART(weekday, @today) + 5)
END
Credo che funziona per tutti i casi.
Altri suggerimenti
Aggiungere una tabella [Calendar]
al vostro DB con tutte le date che bisogno precalcolata. È quindi possibile includere campi con il nome del giorno, il numero, ecc vacanza e semplicemente cercare i valori necessari.
E 'molto più semplice che giocare con DATEADD
Un articolo utile sulle tavole del calendario: Perché dovrei considerare l'utilizzo di una tabella di calendario ausiliario?