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

时间:2015-03-12 07:53:56

标签: sql-server sql-server-2008 datetime

我有一个包含两个日期时间列的表,我正在尝试使用以下查询将它们转换为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

我查看了create table脚本,它们都被定义为datetime。我不知道如何插入数据。

如何让两列都以毫秒返回?

2 个答案:

答案 0 :(得分:1)

SQL Server“有帮助”将修剪毫秒部分,如果它完全为0.如果你需要包括0毫秒(我无法想象你在需要的地方做什么{{1}要包括在内)然后你必须检测修剪并重新添加它们:

.000

(而且,如果出于某些奇怪的原因,你真的需要最终结果是;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)来包裹{ {1}}表达式,因为系统不够聪明,无法意识到CONVERT返回的任何值总是适合CASE

答案 1 :(得分:0)

这是因为第二个日期有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

检查此示例。