2017-07-19 30 views
0

nvarcharの日付を日付時刻に変換しようとしましたが、このエラーが発生します。CASTとConvert(以下のコード)を含むさまざまな方法を試してみました。助言がありますか ?nvarcharからdatetimeへの変換に失敗しました

日付形式:水曜日、2017年7月19日午後4時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'を組み合わせて 'Wed、'と '+ 0000'を削除します。 '' 1919年7月19日16:23:38 'の値は正常に変換されます。 – Santi

+0

これを使用してこの問題を解決してください。https://docs.microsoft.com/en-us/sql/t-sql/functions/isdate-transact-sql –

答えて

1

私は2つの部分、日付の1と時刻の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

EDIT:OlegGordonによるソリューションをチェックしてください。私は実際にそれらを私自身のものに(どちらかといえば畳んでいるので)好む。あなたがから文字を削除することができます

'19 Jul 2017 16:23:38' 

これに


あなたはこのからあなたの日付フォーマットを取得する必要があり

...

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

... ...始めと終わりはLEFTRIGHTです。端から最後の6を削除すると、次のようになります。

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

我々は最初の5を削除するために私たちのRIGHT()ために同じ構文を使用できますが、[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; 
関連する問題