从 nvarchar 到 datetime 的转换失败
Failed conversion from nvarchar to datetime
我正在尝试将 nvarchar 日期转换为日期时间,但出现此错误:我尝试了多种方法,包括 CAST 和 Convert(如下代码)但无济于事。有什么建议么 ?
日期格式: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]
给出的错误:
Conversion failed when converting date and/or time from character string.
编辑: 查看 and 的解决方案。实际上,我更喜欢它们而不是我自己的(因为它非常复杂)。
你需要从这里得到你的日期格式...
'Wed, 19 Jul 2017 16:23:38 +0000'
...到此...
'19 Jul 2017 16:23:38'
您可以使用 LEFT
和 RIGHT
删除开头和结尾的字符。从末尾删除最后 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
(所以我们可以简单地忽略它)。
如果您有使用时区偏移的值,则需要考虑到这一点。
如果您有 MS SQL Server 2012 或更高版本,您可以使用 TRY_PARSE。
SELECT CAST(TRY_PARSE ('Wed, 19 Jul 2017 16:23:38 +0000' AS datetimeoffset) AS datetime)
我会分两部分来做,一部分是日期,一部分是时间:
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];
这最大限度地减少了字符串操作,因此这似乎是一种非常简单的方法。
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;
我正在尝试将 nvarchar 日期转换为日期时间,但出现此错误:我尝试了多种方法,包括 CAST 和 Convert(如下代码)但无济于事。有什么建议么 ?
日期格式: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]
给出的错误:
Conversion failed when converting date and/or time from character string.
编辑: 查看
你需要从这里得到你的日期格式...
'Wed, 19 Jul 2017 16:23:38 +0000'
...到此...
'19 Jul 2017 16:23:38'
您可以使用 LEFT
和 RIGHT
删除开头和结尾的字符。从末尾删除最后 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
(所以我们可以简单地忽略它)。
如果您有使用时区偏移的值,则需要考虑到这一点。
如果您有 MS SQL Server 2012 或更高版本,您可以使用 TRY_PARSE。
SELECT CAST(TRY_PARSE ('Wed, 19 Jul 2017 16:23:38 +0000' AS datetimeoffset) AS datetime)
我会分两部分来做,一部分是日期,一部分是时间:
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];
这最大限度地减少了字符串操作,因此这似乎是一种非常简单的方法。
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;