2017-02-03 33 views
1

enter image description here處理毫秒用則IsDate()函數

我需要爲varchar上述DATE列轉換爲日期格式。所以我用,

SELECT TOP 1000 [Tagname] 
    ,FORMAT((CASE WHEN 1 = ISDATE(CAST([Date] AS VARCHAR))THEN CAST(CAST([Date] AS VARCHAR)AS datetime) else NULL END), 'yyyy-MM-dd HH:mm:ss.fff') AS [Date] 
    ,[Value] 
    ,[VValue] 
    ,[OPCQuality] 
    ,[QualityDetail] 
    ,[QualityDescription] 
    ,[StatusCode] 
    ,[ErrorMessage] FROM [Dashboard].[dbo].[Data20170202123655985] 

而使用此,具有超過3位數的毫秒字段不會轉換爲日期。而我得到的表,

enter image description here

+0

您使用的是什麼服務器? SQL Server,Oracle,MySQL,....? – pringi

+0

[將varchar轉換爲具有millisec的sql中的datetime]可能的副本(http://stackoverflow.com/questions/19025192/convert-varchar-to-datetime-in-sql-which-is-having-millisec) – pringi

+0

@pringi,從他的語法看起來像SQL Server –

回答

2

DateTime沒有足夠的精度,精確地處理毫秒。嘗試改爲將您的varchar數據轉換爲DateTime2

SELECT TOP 1000 [Tagname] 
    ,FORMAT((CASE WHEN 1 = ISDATE(CAST([Date] AS VARCHAR))THEN CAST(CAST([Date] AS VARCHAR)AS datetime2) else NULL END), 'yyyy-MM-dd HH:mm:ss.fff') AS [Date] 
    ,[Value] 
    ,[VValue] 
    ,[OPCQuality] 
    ,[QualityDetail] 
    ,[QualityDescription] 
    ,[StatusCode] 
    ,[ErrorMessage] FROM [Dashboard].[dbo].[Data20170202123655985] 
0
select  FORMAT((CASE WHEN TRY_CONVERT(datetime2,CAST([Date] AS VARCHAR)) IS NOT NULL THEN 
         CAST(CAST([Date] AS VARCHAR)AS datetime2) 
        else 
         null 
        END), 'yyyy-MM-dd HH:mm:ss.fff') AS [Date] 

看到這兩個測試中,我認爲這個問題是在ISDATE以及DATETIME2可能

聲明@date如爲nvarchar(50)=「2016-03-10T09:53:39.138222 Z';

--still didn't seem to work 
select FORMAT((CASE WHEN 1 = ISDATE(CAST(@date AS VARCHAR))THEN 
     CAST(CAST(@date AS VARCHAR)AS datetime2) 
    else 
     NULL 
    END), 'yyyy-MM-dd HH:mm:ss.fff') AS [Date] 

--does now work 
select  FORMAT((CASE WHEN TRY_CONVERT(datetime2,CAST(@Date AS VARCHAR)) IS NOT NULL THEN 
     CAST(CAST(@Date AS VARCHAR)AS datetime2) 
else 
     null 
END), 'yyyy-MM-dd HH:mm:ss.fff') AS [Date]