webForumDet fria alternativet

TSQL: UDF som returnerar första/sista dagen i veckan, månaden m.m.

Programmering

0 svar · 3 533 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

En liten UDF som returnerar första dag och tid under året/månaden/veckan/dagen samt sista dag och tid under samma perioder.
Funktionen behöver tre parametrar:
1. Ett datum
2. Val av returdatum, ange: year, month, week eller day
3. Första eller sista datum, ange: 1 eller 2

OBS! Du kan behöva ange datefirst också vid anropet!

Ex:

set datefirst 1
select dbo.ConvertDate('2005-02-22', 'week', 2)

returnerar: 2005-02-27 23:59:59.997

CREATE FUNCTION ConvertDate
	(@CurrentDate datetime, 
	 @Datetype varchar(5), 
	 @StartEnd tinyint)

RETURNS datetime

AS
	
BEGIN

	DECLARE @Date AS datetime
	DECLARE @Year AS varchar(4)
	DECLARE @Month AS varchar(2)
	DECLARE @Day AS varchar(2)

	SET @Year = DatePart(yyyy, @CurrentDate)
	SET @Month = DatePart(mm, @CurrentDate)
	SET @Day = DatePart(dd, @CurrentDate)

	--startdatum, dvs första tiden/dagen på året, månaden, veckan, dagen
	IF(@StartEnd=1)
	BEGIN
		IF(@Datetype='year')
			SET @Date = CONVERT(datetime, @Year+'-01-01', 21)
		ELSE IF(@Datetype='month')
			SET @Date = CONVERT(datetime, @Year+'-'+@Month+'-1', 21)
		ELSE IF(@Datetype='week')
			SET @Date = CONVERT(datetime, DATEADD(dd, -DATEPART(dw, @CurrentDate)+1, @CurrentDate), 21)
		ELSE IF(@Datetype='day')
			SET @Date = CONVERT(datetime, @Year+'-'+@Month+'-'+@Day, 21)
	END

	--slutdatum, dvs sista tiden/dagen på året, månaden, veckan, dagen
	ELSE IF(@StartEnd=2)
	BEGIN
		IF(@Datetype='year')
			SET @Date = CONVERT(datetime, @Year+'-12-31 23:59:59.998', 21)
		ELSE IF(@Datetype='month')
			SET @Date = CONVERT(datetime, DATEADD(dd, -1, CAST(CAST(year(DATEADD(mm, 1, @CurrentDate)) AS varchar(4))+'-'+CAST(month(DATEADD(mm, 1, @CurrentDate)) AS varchar(2))+'-1 23:59:59.998' AS datetime)), 21)
		ELSE IF(@Datetype='week')
			SET @Date = CONVERT(datetime, DATEADD(dd, (7-DATEPART(dw, @CurrentDate)), CAST(@Year+'-'+@Month+'-'+@Day+' 23:59:59.998' AS datetime)), 21)
		ELSE IF(@Datetype='day')
			SET @Date = CONVERT(datetime, @Year+'-'+@Month+'-'+@Day+' 23:59:59.998', 21)
	END
	
RETURN @Date

END
259 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)