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