转换日期字段格式

时间:2010-09-02 12:56:23

标签: sql-server sql-server-2005 tsql

我有一个带有生日的字段为'7/08/1986'或'07 / 08/1986'。

我想将价值转换为'1986/08/07'。只需从 DD / MM / YYYY 转换为 YYYY / MM / DD 。请注意,这完全在SQL Server 2005中。

此外,如果日期是单个数字,则意味着输出shd将显示为两位数字,如“07”而不是“7”。

如何进行此转换?

你的回复会帮助我。我提前感谢。

3 个答案:

答案 0 :(得分:3)

首先不要将这些日期存储为字符串,使用datetime (Transact-SQL)smalldatetime (Transact-SQL)数据类型(sql server 2008只有date (Transact-SQL)日期),然后您可以轻松地格式化它使用内置工具CONVERT (Transact-SQL)

通过将日期存储为字符串,您可以轻松获得“2/29/2010”或“13/13/2010”等无效日期。在字符串中存储'mm / dd / yyyy'需要10个字节,而存储日期时间需要8个字节,而存储smalldatetime值只需要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

输出:

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

输出:

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

输出:

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

(3 row(s) affected)

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

将会转到YYYY/MM/DD