创建用户定义函数以转换SQL Server中的日期

时间:2012-04-29 03:10:25

标签: sql sql-server tsql

我知道如何在SQL Server(T-SQL)中转换为日期但是如何创建UDF以便每次都可以在我的代码中调用它?

示例1:以下代码将此20120428格式化为04/28/2012

SELECT CONVERT(CHAR(10), CONVERT(DATE, TEST_DATE), 101) AS MY_DATE
FROM
MEMBER
WHERE ISDATE(TEST_DATE) <> 0

示例2:以下代码将此20120428格式化为2012-04-28

SELECT CONVERT(DATE, TEST_DATE) AS MY_DATE
FROM
MEMBER
WHERE ISDATE(TEST_DATE) <> 0

感谢输入!

1 个答案:

答案 0 :(得分:5)

对于第二个例子,你可以这样做:

CREATE FUNCTION dbo.ConvertDate(@d CHAR(10))
RETURNS DATE
AS
BEGIN
    RETURN (SELECT CONVERT(DATE, @d));
END
GO

但更灵活的方法可能是:

CREATE FUNCTION dbo.ConvertRegional
(
  @d CHAR(10),
  @style TINYINT
)
RETURNS CHAR(10)
AS
BEGIN
    RETURN (SELECT CONVERT(CHAR(10), CONVERT(DATE, @d), @style));
END
GO

DECLARE @d CHAR(10);
SELECT @d = '20120428';

SELECT 
 dbo.ConvertDate(@d),
 dbo.ConvertRegional(@d, 101),
 dbo.ConvertRegional(@d, 103),
 dbo.ConvertRegional(@d, 120);

结果:

----------  ----------  ----------  ----------
2012-04-28  04/28/2012  28/04/2012  2012-04-28

如果您不想继续从源表中过滤出错误的非日期(在WHERE子句中保留ISDATE()应该阻止该函数必须处理这些行),您可以更改此函数避免错误的方法,如果NULL可以替代:

CREATE FUNCTION dbo.ConvertRegional
(
  @d CHAR(10),
  @style TINYINT
)
RETURNS CHAR(10)
AS
BEGIN
    RETURN (SELECT CASE WHEN ISDATE(@d) = 1 THEN
      CONVERT(CHAR(10), CONVERT(DATE, @d), @style)
      END);
END
GO

在SQL Server 2012中,您可以改为执行此操作,无需编写自己的CASE即可执行相同的操作:

CREATE FUNCTION dbo.ConvertRegional
(
  @d CHAR(10),
  @style TINYINT
)
RETURNS CHAR(10)
AS
BEGIN
    RETURN (SELECT CONVERT(CHAR(10), TRY_CONVERT(DATE, @d), @style));
END
GO

(实际上在SQL Server 2012中你也可以使用FORMAT(),这样你就不必记住样式编号了,但是因为我不知道你正在使用什么版本我会把它留给另一个版本一天。)

所有这一切,除了在您的查询中保存一些击键之外,这种封装实际上会使您的查询执行得更糟(取决于它们的使用位置)。对于像这样的简单转换,在大多数情况下直接执行它们会更好。