SQL 将 datetime 转换为 varchar 时,Server 2008 结果不一致

SQL Server 2008 inconsistent results when converting datetime to varchar

我有一个包含两个日期时间列的 table,我正在尝试使用以下查询将它们转换为 iso 字符串格式:

select 
   CONVERT(VARCHAR(23), date1, 126) as date1,   
   CONVERT(VARCHAR(23), date2, 126) as date2
from   
   some_table

但我得到了两种不同的结果,一种有毫秒,一种没有

date1                        date2
2015-03-11T05:16:04.663      2015-03-11T05:15:43

我查看了创建 table 脚本,它们都被定义为日期时间。我不知道如何插入数据。

如何让两列都达到 return 毫秒数?

因为第二个日期有0毫秒。

CREATE TABLE #Test ( date1 datetime, date2 datetime)

INSERT INTO #Test VALUES ('2015-03-11 05:16:04.663','2015-03-11 05:15:43' )

INSERT INTO #Test VALUES ('2015-03-11 05:16:04','2015-03-11 05:15:43.55' )


select 
   CONVERT(VARCHAR(23), date1, 126) as date1,   
   CONVERT(VARCHAR(23), date2, 126) as date2
from   
   #Test

检查这个例子。

SQL 服务器 "helpfully" 将 trim 毫秒部分,如果它完全为 0。如果你 需要 包括 0 毫秒(我可以不要想象你在做什么,你需要 .000 被包括在内)然后你必须检测 trimming 并重新添加它们:

;With Converted as (
    --Your existing query. For this example, I'm just using one date:
    select CONVERT(varchar(23),CONVERT(datetime,'2015-03-01T05:15:43.000'),126) as date2
)
select
    CASE
        WHEN LEN(date2) = 19 THEN date2 + '.000'
        ELSE date2
    END as date2
from Converted

(而且,如果出于某种奇怪的原因你真的需要最终结果是 varchar(23) 而不是 varchar(27) 你将不得不添加另一个 CONVERT 包装CASE 表达式,因为系统不够智能,无法意识到 CASE returns 可以始终适合 varchar(23))

的任何值