2010-09-02 80 views
0

我有一个生日为'7/08/1986'或'07/08/1986'的字段。转换日期字段格式

我想将值转换为'1986/08/07'。简单地从DD/MM/YYYYYYYY/MM/DD。请注意这一切都在SQL Server 2005中。

此外,如果日期是单数字意味着输出shd仍然显示为两位数,如'07'而不是'7'。

我该如何做这种转换?

您的善意答复将帮助我。我提前感谢。

回答

0

您可以将输入的生日转换为日期时间字段,然后立即再次将其转换为varchar。试试这个:

select convert(varchar(10), convert(datetime, '7/8/1986'), 111) 

输出应该是'1986/07/08',一个varchar。

0
CONVERT(nvarchar(30), GETDATE(), 111) 

中你会看到YYYY/MM/DD

3

先不要储存这些日期为字符串,使用datetime (Transact-SQL)smalldatetime (Transact-SQL)数据类型(SQL Server 2008中具有唯一日期的date (Transact-SQL)),那么你就可以很容易地格式它使用内置工具CONVERT (Transact-SQL)

通过将日期存储为字符串,您可以轻松地获取'2/29/2010'或'13/13/2010'等无效日期。还需要10个字节来将'mm/dd/yyyy'存储在一个字符串中,而需要8个字节来存储日期时间,并且只需要4个字节来存储小日期时间值。当你存储字符串日期时,你最终会遇到难以处理值的问题(比如这个问题中的问题)。如果你使用datetime或smalldatetime你的代码会是这样的:

DECLARE @YourTable table (YourDate datetime) 
INSERT @YourTable VALUES ('12/1/2010 13:45') 
INSERT @YourTable VALUES ('20101201 8:00am') 
INSERT @YourTable VALUES ('2010-12-01') 

SELECT 
    CONVERT(char(10),YourDate,111)  AS DateOnly 
     ,CONVERT(char(23),YourDate,121) AS FullDateTime 
     ,CONVERT(char(12),YourDate,107) AS MonthNameOf 
     ,CONVERT(char(12),YourDate,114) AS TimeOnly 
     --there are many more output display formats 
    FROM @YourTable 

OUTPUT:

DateOnly FullDateTime   MonthNameOf TimeOnly 
---------- ----------------------- ------------ ------------ 
2010/12/01 2010-12-01 13:45:00.000 Dec 01, 2010 13:45:00:000 
2010/12/01 2010-12-01 08:00:00.000 Dec 01, 2010 08:00:00:000 
2010/12/01 2010-12-01 00:00:00.000 Dec 01, 2010 00:00:00:000 

(3 row(s) affected) 

要解决现有的字符串列按照这个例子:

设置您现有的表(OP不需要这样做,因为这个表已经存在):

CREATE TABLE HasBadStringDates (DateOf varchar(10) null) 
INSERT HasBadStringDates VALUES ('1986/08/07') 
INSERT HasBadStringDates VALUES ('7/08/1986') 
INSERT HasBadStringDates VALUES ('07/08/1986') 

select * from HasBadStringDates 

OUTPUT :

DateOf 
---------- 
1986/08/07 
7/08/1986 
07/08/1986 

(3 row(s) affected) 

解决您现有的表:

ALTER TABLE HasBadStringDates 
    ALTER COLUMN DateOf datetime NULL 
GO 

select CONVERT(char(10),DateOf,111) AS DateOnly from HasBadStringDates 

OUTPUT:

DateOnly 
---------- 
1986/08/07 
1986/07/08 
1986/07/08 

(3 row(s) affected) 
+0

+1了很好的描述。 – hims056 2012-08-21 09:01:06