CREATE FUNCTION [DBO].[to_date](@P_FORMAT VARCHAR(30),
@P_STRING VARCHAR(30))
RETURNS DATETIME
AS
BEGIN
DECLARE @V_DAY INT
DECLARE @V_MONTH INT
DECLARE @V_YEAR INT
DECLARE @V_HOUR INT
DECLARE @V_MINUTE INT
DECLARE @V_SECOND INT
DECLARE @V_DATETIME DATETIME
SET @V_DAY = charindex('dd', @P_FORMAT)
SET @V_MONTH = charindex('mm', @P_FORMAT)
SET @V_YEAR = charindex('yyyy', @P_FORMAT)
SET @V_HOUR = charindex('hh', @P_FORMAT);
SET @V_MINUTE = charindex('nn', @P_FORMAT);
SET @V_SECOND = charindex('ss', @P_FORMAT);
IF @V_DAY = 0
SET @V_DAY=1
ELSE
SET @V_DAY=CONVERT(INT, substring(@P_STRING, @V_DAY, 2));
IF @V_MONTH = 0
SET @V_MONTH=1
ELSE
SET @V_MONTH=CONVERT(INT, substring(@P_STRING, @V_MONTH, 2));
IF @V_YEAR = 0
SET @V_YEAR=2000
ELSE
SET @V_YEAR=CONVERT(INT, substring(@P_STRING, @V_YEAR, 4));
IF @V_HOUR = 0
SET @V_HOUR=0
ELSE
SET @V_HOUR=CONVERT(INT, substring(@P_STRING, @V_HOUR, 2));
IF @V_MINUTE = 0
SET @V_MINUTE=0
ELSE
SET @V_MINUTE=CONVERT(INT, substring(@P_STRING, @V_MINUTE, 2));
IF @V_SECOND = 0
SET @V_SECOND=0
ELSE
SET @V_SECOND=CONVERT(INT, substring(@P_STRING, @V_SECOND, 2));
SET @V_DATETIME=CONVERT(DATETIME, cast(@V_YEAR AS VARCHAR) + '-'
+ cast(@V_MONTH AS VARCHAR) + '-'
+ cast(@V_DAY AS VARCHAR) + ' '
+ cast(@V_HOUR AS VARCHAR) + ':'
+ cast(@V_MINUTE AS VARCHAR) + ':'
+ cast(@V_SECOND AS VARCHAR), 120);
RETURN @V_DATETIME;
END
Thats me sauve un tas de temps, Muchus gracias – Chin
@Chin méfiez-vous de vos affaires de pointe que le code ci-dessus ne retournerait pas un record avec « 2003-12-31 10:07:42 » en elle. En l'absence de temps, il est supposé être 0:00:00. Vous pouvez utiliser '01/01/2004 'ou '12/31/2003 23:59:59' – SqlACID
En utilisant un format explicite 'CONVERT (datetime, '01/01/2003 ', 103)' vous sauvera un beaucoup de problèmes potentiels. – erikkallen