2014-09-05 59 views
1

创建的函数将日期更改为这种格式yyyymmddThhmmssZ的SQL Server:功能更改日期格式YYYYMMDDTHHMMSSZ

下面是函数

USE [IMT] 
GO 

/****** Object: UserDefinedFunction [dbo].[GetForamttedDate] Script Date: 09/05/2014 12:46:05 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

-- ============================================= 
-- Author:  rthomas 
-- Create date: 04/08/14 
-- ============================================= 
ALTER FUNCTION [dbo].[GetForamttedDate] 
(
    -- Add the parameters for the function here 
    @InitialDate smalldatetime 
) 
RETURNS VARCHAR 
AS 
BEGIN 
Declare @FormatDateInitial varchar(50) 
Declare @FormatDate varchar(50) 
Declare @FormatDateFinal VARCHAR(50) 
Declare @Debug  BIT = 0 

SET @FormatDateInitial = (SELECT convert(varchar(30), @InitialDate,121)) 
SET @FormatDate =(SELECT SUBSTRING(@FormatDateInitial,1,4)+SUBSTRING(@FormatDateInitial,6,2)+SUBSTRING(@FormatDateInitial,9,2)+' '+SUBSTRING(@FormatDateInitial,12,2)+SUBSTRING(@FormatDateInitial,15,2)+SUBSTRING(@FormatDateInitial,18,2)) 
SET @FormatDateFinal= STUFF(@FormatDate,9,1,'T')+'Z' 
return @FormatDateFinal 

END 

GO 

而且它返回20140805T121109Z

但是,当我在表中使用这个函数作为日期列,它只返回一个字符。

select function_name(date_column) from table 

回报只有2

请帮我

+1

请提供该函数的定义,包括参数,类型和列的内容。另外,使用varchar(max)是毫无意义的 - 你在任何时候都不期待2GB blob – 2014-09-05 08:18:01

+0

你为什么要在数据库中处理表示?这确实应该是表示层的工作。 – Luaan 2014-09-05 08:18:37

+4

我几乎打赌你有一个'RETURNS VARCHAR'没有任何**长度**的varchar定义 - 然后你得到一个** 1字符**的默认长度。如果是这样,请阅读(和**拥抱!**)[踢坏的习惯:在没有(长度)的情况下声明VARCHAR](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-你应该**总是**为你使用的任何'varchar'变量和参数提供一个长度 – 2014-09-05 08:18:38

回答

0

问题是这样的:

ALTER FUNCTION [dbo].[GetForamttedDate] (@InitialDate smalldatetime) 
RETURNS VARCHAR 

RETURNS VARCHAR会给你的1个字符默认长度!

你应该养成的习惯总是明确定义任何参数和变量的有效长度,只要你使用一个!

请参阅(和拥抱!)这个博客帖子上说的话题