Voici une fonction qui prend une date et un jour de la semaine en entrée. Il renvoie la date la plus récente avec ce jour de la semaine.
Il suppose un DATEFIRST de 7 (Fait dimanche 1er jour).
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[udf_getDateFromDayName]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[udf_getDateFromDayName]
GO
--Set Sunday to be day one
SET DATEFIRST 7
GO
CREATE FUNCTION [dbo].[udf_getDateFromDayName]
(
@dtsMaxDate DATETIME,
@sDayName VARCHAR(8)
)
RETURNS DATETIME
AS
BEGIN
DECLARE @iDayNumber INT, @dtsTemp DATETIME
SET @sDayName = LEFT(UPPER(@sDayName),3)
SET @iDayNumber =
(CASE
WHEN @sDayName = 'SUN' THEN 1
WHEN @sDayName = 'MON' THEN 2
WHEN @sDayName = 'TUE' THEN 3
WHEN @sDayName = 'WED' THEN 4
WHEN @sDayName = 'THU' THEN 5
WHEN @sDayName = 'FRI' THEN 6
WHEN @sDayName = 'SAT' THEN 7
ELSE 0 --Invalid day
END
)
IF @iDayNumber = 0 RETURN NULL
SET @dtsTemp = CAST(FLOOR(CAST(@dtsMaxDate AS FLOAT)) AS DATETIME)
WHILE DATEPART(DW,@dtsTemp) <> @iDayNumber
SET @dtsTemp = DATEADD (dd, -1, @dtsTemp)
RETURN @dtsTemp
END
GO
Une fois que vous avez la fonction, votre requête est simple.
Vous pouvez faire quelque chose comme ceci:
Ou idéalement, mettre la date max dans une première variable:
DECLARE @dtsNow DATETIME
SET @dtsNow = GETDATE()
SELECT dbo.udf_getDateFromDayName(@dtsNow,'mon') [Mon],
dbo.udf_getDateFromDayName(@dtsNow,'tue') [Tue],
dbo.udf_getDateFromDayName(@dtsNow,'wed') [Wed],
dbo.udf_getDateFromDayName(@dtsNow,'thu') [Thu],
dbo.udf_getDateFromDayName(@dtsNow,'fri') [Fri],
dbo.udf_getDateFromDayName(@dtsNow,'sat') [Sat],
dbo.udf_getDateFromDayName(@dtsNow,'sun') [Sun]
Pouvez-vous préciser le type de résultats que vous cherchez à obtenir? – Seibar
Je ne comprends pas ce que vous essayez d'accomplir ici. –
Oliver S: Votre question n'a aucun sens, car l'exemple de requête ne retourne rien d'utile. Décrivez ce que vous essayez vraiment de faire et les gens peuvent vous donner des réponses plus pertinentes. –