在 Sql 服务器中接受所有 varchar 类型和 return 特定日期时间格式的通用函数

Generic function which accept all varchar type and return specific datetime format in Sql server

输入:

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

输入需要return,具体格式为yyyy-mm-dd hh:mm:ss

求推荐。

使用以下函数,您可以将日期转换为特定格式:

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

This page 包含多种日期格式。

1) 对每个 date/time 样式使用 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 = 日-月-年 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