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

标签 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

感谢您的意见!

盖伊

最佳答案

对于第二个示例,您可以这样做:

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

如果您不想继续从源表中过滤掉错误的非日期(将 ISDATE() 保留在 WHERE 子句中应该可以防止函数必须处理这些行),您可以将此函数更改为避免错误的方法,如果 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(),这样您就不必记住样式编号,但由于我不知道您使用的是哪个版本,所以我将其留给另一个版本日。)

总而言之,除了在查询中节省一些击键之外,这种封装实际上会使您的查询性能更差(取决于它们的使用位置)。对于像这样的简单转换,在大多数情况下最好直接内联执行它们。

关于sql - 创建用户定义函数来转换 SQL Server 中的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369389/

相关文章:

mysql - 如何在 MySQL 中按两列比较两个查询?

mysql - MySQL 中何时使用单引号、双引号和反引号

sql-server - 在 FROM 子句中多次指定相关名称 'MR'

SQL 服务器 : How to get hold of XML attributes in a query?

sql - sql server中这些关键字的用途是什么(UPDLOCK、ROWLOCK READPAST)

sql - 来自 SQL 查询的奇怪行为

mysql - 从 TIME_FORMAT() 中删除 00 值

sql - sql server中所述日期之间的日期为空

sql - 为什么在 Crystal 报表中使用beforereadingrecords/whilereadingrecords/whileprintingrecords?

sql-server - 如何选择 * 但不包含 "Column names must be unique in each view"