Hi Zoe,
The length is not fixed, there are examples of lengths 4,6(which have to reject as invalid date), 8, 12, 14, 17, 19 in case it is valid I have to consider it by taking date and time if available, else reject all the invalid dates.
The original post is working for 8 length and I have written below for all other lengths
I have to reject all dates < 1900-01-01 and > 2099-01-01 along with all other invalid dates of length 4, 6 etc. Reject in the sense, just return the same value what is received instead of formatting it to a valid date, just return the same value without format. (it is fine if it is removing + - etc. with the replace statement below before returning the invalid data(dates))
FUNCTION [dbo].[CleanDate](@dateParam varchar(30))
RETURNS varchar(30)
AS
BEGIN
DECLARE @date VARCHAR(30);
DECLARE @StartDt DATE ='1900-01-01'
DECLARE @EndDt DATE ='2099-01-01'
DECLARE @TestDt DATE
SET @date = @dateParam
SET @dateParam = Replace(Replace(Replace(@dateparam, '+', ''), '-',''),' ','')
IF LEN(@dateParam) >= 15
BEGIN
SET @date = SUBSTRING(@dateParam, 1, 4) + '-' + SUBSTRING(@dateParam, 5, 2) + '-' + SUBSTRING(@dateParam, 7,2)
+' '+SUBSTRING(@dateParam, 9, 2) + ':'+SUBSTRING(@dateParam, 11, 2) + ':'+SUBSTRING(@dateParam, 13, 2) + '.'+SUBSTRING(@dateParam, 15, 3)
SET @date = CASE WHEN (Try_Convert(DATE, @date) > @StartDt AND Try_Convert(DATE, @date) < @EndDt) THEN @date
ELSE @dateParam
END
END
ELSE IF LEN(@dateParam) = 14
BEGIN
SET @date = SUBSTRING(@dateParam, 1, 4) + '-' + SUBSTRING(@dateParam, 5, 2) + '-' + SUBSTRING(@dateParam, 7,2)
+' '+SUBSTRING(@dateParam, 9, 2) + ':'+SUBSTRING(@dateParam, 11, 2) + ':'+SUBSTRING(@dateParam, 13, 2)+'.000'
SET @date = CASE WHEN (Try_Convert(DATE, @date) > @StartDt AND Try_Convert(DATE, @date) < @EndDt) THEN @date
ELSE @dateParam
END
END
ELSE IF LEN(@dateParam) = 12
BEGIN
SET @date = SUBSTRING(@dateParam, 1, 4) + '-' + SUBSTRING(@dateParam, 5, 2) + '-' + SUBSTRING(@dateParam, 7,2)
+' '+SUBSTRING(@dateParam, 9, 2) + ':'+SUBSTRING(@dateParam, 11, 2) +':00.000'
SET @date = CASE WHEN (Try_Convert(DATE, @date) > @StartDt AND Try_Convert(DATE, @date) < @EndDt) THEN @date
ELSE @dateParam
END
END
ELSE IF LEN(@dateParam) = 8
BEGIN
SET @date = SUBSTRING(@dateParam, 1, 4) + '-' + SUBSTRING(@dateParam, 5, 2) + '-' + SUBSTRING(@dateParam, 7,2)+' 00:00:00.000'
SET @date = CASE WHEN ISDATE(@date) = 1 THEN @date
ELSE
SUBSTRING(@dateParam, 5, 4) + '-' + SUBSTRING(@dateParam, 3, 2) + '-' + SUBSTRING(@dateParam, 1,2)+' 00:00:00.000'
END
SET @date = CASE WHEN (Try_Convert(DATE, @date) > @StartDt AND Try_Convert(DATE, @date) < @EndDt) THEN @date
ELSE
@dateParam
END
END
RETURN @date
END