J'ai une table de date générique.
J'essaie d'atteindre la sortie suivante p>
Je ne peux pas Semblait obtenir la bonne sortie en utilisant cette affaire STEMENT P>
SELECT DayOfWeek, ShortDate, CASE WHEN (DayOfWeekNumber = '1' OR DayOfWeekNumber = '7') -- Saturday or Sunday THEN (SELECT TOP 1 ShortDate FROM DateTable DD WHERE DayOfWeekNumber = 6) ELSE ShortDate END AS ExpectedShortDate FROM DateTable WHERE ShortDate >= '3/13/2020'
3 Réponses :
Vous pouvez simplement vérifier le jour de la semaine et appliquer un décalage en conséquence, dans une expression conditionnelle.
supposant que vous utilisez SQL Server (comme utilisation de Sélectionnez le top 1 code> dans votre requête suggère): p>
SELECT DayOfWeek, ShortDate, CASE WHEN (DayOfWeekNumber = '1') -- Sunday THEN (select FORMAT(DATEADD(DAY, -2, ShortDate), 'MM/dd/yyyy') AS date) WHEN (DayOfWeekNumber = '7') -- Saturday THEN (select FORMAT(DATEADD(DAY, -1, ShortDate), 'MM/dd/yyyy') AS date) ELSE ShortDate END AS ExpectedShortDate FROM DateTable
Tout en regardant une vidéo de formation de Brent Ozar, il a recommandé de créer une table de date (dbo.t_date) qui stockera N nombre d'attributs, y compris le jour de la semaine, le trimestre, le premier jour du mois, etc. Avoir une telle table Ces types d'activités sont un coup d'œil et enregistrez le prochain développeur de devoir lire un code méchant. P>
Cela peut ressembler à ceci: p>
Créer une table dbo.t_date (..., date datetetime2, jour_of_week varchar (100), ...) p>
De là, je suppose que vous pouvez prendre le reste du chemin. En outre, la table DBO.T_Date peut également servir de tableau de numéros, qui est utile lorsque vous souhaitez empêcher de boucler vos requêtes ... P>