格式化日期为yyyy-mm-dd hh:mm:ss.000

时间:2013-08-02 16:03:09

标签: sql sql-server date

我有这个日期:7/19/2013

我想将其格式化如下:

2013-07-19 00:00:00.000

我试过了:

select convert(varchar(10),'7/19/2013',120)

但它给了我同样的结果!

3 个答案:

答案 0 :(得分:13)

你需要告诉SQL Server它是一个日期;否则,它只会看到一个字符串,并忽略样式编号,因为它与字符串无关。正如Steve Kass指出的那样,如果您保护传入的字符串免受不正确的基于区域或语言的翻译(例如d/m/y - 这可能导致错误,或者更糟糕的是,错误的数据,则代码只是真正可移植的)。我已更新代码以将字符串解释为m/d/y而不管语言环境如何,但如果您使用的是SQL Server 2012,则还可以在其示例中使用PARSE()(或TRY_PARSE()你想基本上忽略无效日期。)

如果您想要附加时间(包括毫秒),则需要允许超过10个字符,以及支持毫秒的样式。

SELECT CONVERT(CHAR(23),CONVERT(DATETIME,'7/19/2013',101),121);

结果:

2013-07-19 00:00:00.000

如果您不关心毫秒,则可以改为使用样式120:

SELECT CONVERT(CHAR(19),CONVERT(DATETIME,'7/19/2013',101),120);

如果你不关心秒,你可以先截断:

SELECT CONVERT(CHAR(16),CONVERT(DATETIME,'7/19/2013',101),120);

答案 1 :(得分:3)

请注意,如果服务器本地化为以DMY作为日期格式的语言,则Aaron的解决方案将失败。这是因为Aaron示例中的内部CONVERT将包含服务器区域设置,这可能不是您所期望的。

要使此防弹(假设字符串的源不会自动重新本地化格式),请使用PARSE转换字符串(需要SQL Server 2012或更高版本)。

SET LANGUAGE English
SELECT CONVERT(CHAR(23),TRY_CONVERT(DATETIME,'7/19/2013'),121);
SELECT CONVERT(CHAR(23),PARSE('7/19/2013' AS DATETIME USING 'en-US'),121);

SET LANGUAGE Français
SELECT CONVERT(CHAR(23),TRY_CONVERT(DATETIME,'7/19/2013'),121);
SELECT CONVERT(CHAR(23),PARSE('7/19/2013' AS DATETIME USING 'en-US'),121);

答案 2 :(得分:-1)

添加到您的查询中,您可以根据需要添加零/字符:)...

SELECT CONVERT(VARCHAR (10),'7/19/2013',120) + ' 00:00:00.000'

结果:

7/19/2013 00:00:00.000