Jouer avec Date Heure dans SQL Server
-
09-10-2019 - |
Question
Je construis un rapport de SSRS.
Dans le rapport, la semaine passe toujours du lundi -. Dimanche
Et je veux savoir la date de début et de fin de deux semaines avant.
Par exemple,
Si la date actuelle = 1 janvier 2011
- semaine en cours = 27 déc 2010 au 2 janvier 2011
- semaine précédente = 20 déc 2010 au 26 décembre 2010
J'ai essayé ce qui suit, mais semble comme elle échoue quand quand le jour courant = dimanche
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
Comment puis-je résoudre ce problème?
La solution
Je ne sais pas si cela est la solution la plus élégante, mais vous pouvez faire une déclaration de cas avec votre @offset comme ceci:
SET @offset = CASE WHEN DATEPART(weekday, @today) >= 2
THEN -(DATEPART(weekday, @today) - 2)
ELSE -(DATEPART(weekday, @today) + 5)
END
Je crois que cela fonctionne pour tous les cas.
Autres conseils
Ajouter une table [Calendar]
à votre DB avec toutes les dates dont vous avez besoin précalculées. Vous pouvez ensuite inclure des champs avec le nom du jour, le nombre, vacances, etc., et il suffit de regarder les valeurs dont vous avez besoin.
Il est beaucoup plus simple que de jouer avec DATEADD
Un article utile sur les tables de calendrier: Pourquoi devrais-je envisager d'utiliser une table de calendrier auxiliaire?