Asy*_*ous 3 sql t-sql sql-server
我知道如何在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
Run Code Online (Sandbox Code Playgroud)
示例2:以下代码将此20120428格式化为2012-04-28
SELECT CONVERT(DATE, TEST_DATE) AS MY_DATE
FROM
MEMBER
WHERE ISDATE(TEST_DATE) <> 0
Run Code Online (Sandbox Code Playgroud)
感谢输入!
家伙
对于第二个示例,您可以执行此操作:
CREATE FUNCTION dbo.ConvertDate(@d CHAR(10))
RETURNS DATE
AS
BEGIN
RETURN (SELECT CONVERT(DATE, @d));
END
GO
Run Code Online (Sandbox Code Playgroud)
但更灵活的方法可能是:
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);
Run Code Online (Sandbox Code Playgroud)
结果:
---------- ---------- ---------- ----------
2012-04-28 04/28/2012 28/04/2012 2012-04-28
Run Code Online (Sandbox Code Playgroud)
如果您不想继续从源表中过滤出错误的非日期(在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
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
(实际上在SQL Server 2012中,您也可以使用FORMAT(),这样您就不必记住样式编号,但由于我不知道您正在使用哪个版本,因此我会将其留下另一天.)
除此之外,除了在查询中保存一些击键外,这种封装实际上会使您的查询性能更差(取决于它们的使用位置).对于像这样的简单转换,在大多数情况下直接执行它们会更好.
| 归档时间: |
|
| 查看次数: |
8305 次 |
| 最近记录: |