输入:
11-07-2016 14:21:59
08/07/2016 5:12:52 PM
输出:
2016-07-11 14:21:59
2016-07-08 17:12:52
我的日期格式为dd-mm-yyyy hh:mm:ss
输入需要以特定格式返回yyyy-mm-dd hh:mm:ss
请建议。
输入:
11-07-2016 14:21:59
08/07/2016 5:12:52 PM
输出:
2016-07-11 14:21:59
2016-07-08 17:12:52
我的日期格式为dd-mm-yyyy hh:mm:ss
输入需要以特定格式返回yyyy-mm-dd hh:mm:ss
请建议。
1) 对每个日期/时间样式使用 TRY_CONVERT 进行简单的 COALESCE 调用就足够了。您不必创建专用的 UDF:
SELECT x.VarCharCol,
COALESCE( TRY_CONVERT(DATETIME, NULLIF(x.VarCharCol, ''), 103), TRY_CONVERT(DATETIME, NULLIF(x.VarCharCol, ''), 105) ) AS DateTimeCol,
CONVERT( VARCHAR(100), COALESCE( TRY_CONVERT(DATETIME, NULLIF(x.VarCharCol, ''), 103), TRY_CONVERT(DATETIME, NULLIF(x.VarCharCol, ''), 105) ), 120) AS DTAsVarCharWithCustomFormat
FROM (VALUES
('11-07-2016 14:21:59 '),
('08/07/2016 5:12:52 PM'),
(''),
(NULL),
('dafdf')
) x(VarCharCol)
GO
/*
VarCharCol DateTimeCol DTAsVarCharWithCustomFormat
--------------------- ----------------------- ---------------------------
11-07-2016 14:21:59 2016-07-11 14:21:59.000 2016-07-11 14:21:59
08/07/2016 5:12:52 PM 2016-07-08 17:12:52.000 2016-07-08 17:12:52
NULL NULL
NULL NULL NULL
dafdf NULL NULL
*/
103 = dd/mm/yyyy 105 = dd-mm-yyyy 120 = yyyy-mm-dd hh:mi:ss(24h)
2) 但是如果我必须创建一个 UDF,我会选择一个内联 UDF。通常,与标量函数相比,内联 UDF 具有更好的性能。
CREATE FUNCTION dbo.GetDateTimeValueFromString(@VarCharValue VARCHAR(50))
RETURNS TABLE
AS
RETURN
SELECT COALESCE( TRY_CONVERT(DATETIME, NULLIF(@VarCharValue, ''), 103), TRY_CONVERT(DATETIME, NULLIF(@VarCharValue, ''), 105) ) AS DateTimeValue
GO
SELECT x.VarCharCol,
y.DateTimeValue AS DateTimeCol,
CONVERT( VARCHAR(100), y.DateTimeValue, 120) AS DTAsVarCharWithCustomFormat
FROM (VALUES
('11-07-2016 14:21:59 '),
('08/07/2016 5:12:52 PM'),
(''),
(NULL),
('dafdf')
) x(VarCharCol)
OUTER APPLY dbo.GetDateTimeValueFromString(x.VarCharCol) AS y
GO
注意:对于标量 UDF,我将使用WITH SCHEMABINDING
使用以下函数,您可以将日期转换为特定格式:
CREATE FUNCTION [dbo].[fn_ReturnSpecificDateFormat]
(@InputDate VARCHAR (100))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @RetrunFormat AS VARCHAR (19) = '';
IF CHARINDEX(' ', @InputDate, 1) = 9
SET @RetrunFormat = CONVERT(VARCHAR(19), CONVERT(DATETIME, @InputDate, 5), 120)
ELSE
SET @RetrunFormat = CONVERT(VARCHAR(19), CONVERT(DATETIME, @InputDate, 105), 120)
RETURN @RetrunFormat
END
使用给定的示例数据执行示例:
DECLARE @DateSpecificFormat TABLE (TestDate VARCHAR (100));
INSERT INTO @DateSpecificFormat (TestDate) VALUES
('17/07/16 2:56:20 PM'),
('11-07-2016 14:21:59'),
('08/07/2016 5:12:52 PM'),
('14-07-2016 05:12:52 PM');
SELECT TestDate, [dbo].[fn_ReturnSpecificDateFormat] (TestDate) AS SpecificFormat
FROM @DateSpecificFormat;
结果:
TestDate SpecificFormat
---------------------- --------------------
17/07/16 2:56:20 PM 2016-07-17 14:56:20
11-07-2016 14:21:59 2016-07-11 14:21:59
08/07/2016 5:12:52 PM 2016-07-08 17:12:52
14-07-2016 05:12:52 PM 2016-07-14 17:12:52
此页面包含各种日期格式。