【问题标题】:SQL Server 2008 inconsistent results when converting datetime to varchar将日期时间转换为 varchar 时 SQL Server 2008 的结果不一致
【发布时间】:2015-03-12 07:53:55
【问题描述】:

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

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

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

【问题讨论】:

  • date2s 的值是否始终为 0 毫秒?因为我认为如果没有非零数字,它会跳过毫秒。

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


【解决方案1】:

如果毫秒部分完全为 0,SQL Server“有帮助”将修剪毫秒部分。如果您需要包括 0 毫秒(我无法想象您在需要 .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),您将不得不添加另一个包装 CASE 表达式的 CONVERT,因为系统的不够聪明,无法意识到CASE 返回的任何值总是适合varchar(23))

【讨论】:

  • 如果格式不一致,那还有什么意义呢。谢谢伙计,这不是你的错,mssql 是不可能的。我会在 5 分钟内接受。
【解决方案2】:

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

检查这个例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多