3

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

我想将其格式化如下:

2013-07-19 00:00:00.000

我试过这个:

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

但它给了我同样的结果!

4

3 回答 3

15

您需要告诉 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);
于 2013-08-02T16:05:05.917 回答
4

请注意,如果服务器本地化为使用 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);
于 2013-08-02T16:55:34.447 回答
0

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

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

结果:

7/19/2013 00:00:00.000
于 2015-09-18T13:33:27.873 回答