2017-07-19 190 views
0

我想一個nvarchar日期轉換爲日期時間,但出現此錯誤:我已經嘗試了多種方式,包括CAST和轉換(如下面的代碼)與無濟於事。有什麼建議麼 ?無法轉換爲nvarchar從爲datetime

日期格式:星期三,2017年7月19日16時23分38秒+0000

代碼:

INSERT INTO feed.article(title,link,sourceID,[date]) 
    SELECT title,link,s.sourceID, 
    CONVERT(DATETIME,[date],121) 
    FROM feed.tempXML t 
    JOIN feed.[source] s ON s.sourceName = t.[source] 

錯誤給出:

轉換日期轉換失敗時和/或字符串的時間。

+0

你什麼錯誤? –

+3

使用'LEFT'和'RIGHT'的組合去除'週三,'和'+ 0000'。 2017年7月19日16:23:38''的值將成功轉換。 – Santi

+0

使用此來幫助您解決問題https://docs.microsoft.com/en-us/sql/t-sql/functions/isdate-transact-sql –

回答

1

我將分兩個部分,一個用於日期,一個是時間做到這一點:

SELECT title,link,s.sourceID, 
     (CONVERT(DATETIME, SUBSTRING([date], 5, 10), 106) + 
     CONVERT(DATETIME, SUBSTRING([date], 18, 8)) 
     ) 
FROM feed.tempXML t JOIN 
    feed.[source] s 
    ON s.sourceName = t.[source]; 

這最大限度地減少字符串操作,所以它似乎是一個非常簡單的方法。

0

編輯:通過OlegGordon退房的解決方案。我實際上更喜歡他們對我自己(因爲它很複雜)。


你需要得到你的這個日期格式...

'Wed, 19 Jul 2017 16:23:38 +0000' 

...這個...

'19 Jul 2017 16:23:38' 

您可以從刪除字符開始和結束使用LEFTRIGHT。從最終刪除過去的6應該是這樣的:

LEFT([date], LEN[date] - 6) 

我們可以使用相同的語法爲我們RIGHT()去除前5,但[date]現在必須從上面的整個字符串代替:

-- RIGHT([date], LEN([date]) - 5) becomes... 
RIGHT(LEFT(@d, LEN(@d) - 6), LEN(LEFT(@d, LEN(@d) - 6)) - 5) 

所有的一切,它的醜陋,但工作原理:

INSERT INTO feed.article(title,link,sourceID,[date]) 
SELECT title,link,s.sourceID, 
CONVERT(DATETIME,RIGHT(LEFT([date], LEN([date]) - 6), LEN(LEFT([date], LEN([date]) - 6)) - 5),121) 
FROM feed.tempXML t 
JOIN feed.[source] s ON s.sourceName = t.[source] 

重要提示:這是在假設您的日期格式都是有開頭5個不必要的字符,並且您的時區偏移量(+0000末)將永遠是0(所以我們可以簡單地忽略它)。

如果你有價值觀,使利用區偏移的,你需要考慮到這一點。

2

如果您有MS SQL Server 2012中或更高版本,可以使用TRY_PARSE。

SELECT CAST(TRY_PARSE ('Wed, 19 Jul 2017 16:23:38 +0000' AS datetimeoffset) AS datetime) 
0
Based on the format, we should be able make a few "safe assumptions"... 
    1) The weekday will always be expressed as a 3 char abbreviation. 
    2) The 3 char abbreviation will be followed by a comma and a space. 
    3) The portion of code we're interested in will be either 19 or 20 characters. 
     (10 for single digit dates and 20 for double digit dates) 
    4) There will be a space following the date. 

    Based on these assumptions, you should be safe to use the following... 

     CREATE TABLE #TestData (
      StringDate NVARCHAR(40) NOT NULL 
      ); 
     INSERT #TestData (StringDate) VALUES 
      (N'Wed, 19 Jul 2017 16:23:38 +0000'), 
      (N'Wed, 9 Jul 2017 16:23:38 +0000'); 

     SELECT 
      DateTimeDate = CAST(SUBSTRING(td.StringDate, 6, 20) AS DATETIME) 
     FROM 
      #TestData td;