首页 > 解决方案 > 转换日期时间的意外结果

问题描述

我试图将日期格式化为 01/01/2012 6:10:00 PM,但我不断收到 2012-01-01 18:10:00.000,Microsoft 手册建议我使用格式 103 以我的理解。103 = 日/月/年

这就是我所拥有的

SELECT convert(datetime,'01-01-2012 6:10:00 PM',103)

我在这里做错了什么?

标签: sqlsql-server

解决方案


转换为日期时间时,样式(在您的情况下103)指示正在接收的字符串的格式,即SELECT CONVERT(DATE, '01/02/2012', 103),将被解释为 2 月 1 日,而不是 1 月 2 日。此转换的输出将是类型DATETIME,并且日期没有隐式格式,它们可以用不同格式的字符串表示,但日期时间本身没有。因此,您首先需要使用基于输入的样式(105:dd-mm-yyyy或 110 :)将字符串转换为日期时间mm-dd-yyyy,然后使用您要输出的样式(103)将其转换回字符串:

SELECT CONVERT(VARCHAR(10), CONVERT(DATETIME, '01-02-2012 6:10:00 PM', 105), 103),
        CONVERT(VARCHAR(10), CONVERT(DATETIME, '01-02-2012 6:10:00 PM', 110), 103)

如果您的输入是一个常量格式的字符串,并且始终有效,并且您想输出一个字符串,那么您可能会发现简单的字符串操作最适合您。例如

SELECT REPLACE(LEFT('01-02-2012 6:10:00 PM', 10), '-', '/')

给出:

01/02/2012

这没有转换的开销,所以应该更快(我没有测试过这是否很重要),也没有潜在的错误,但这可能不是你想要的。


推荐阅读