2016-09-22 99 views
0

我正在编写一个查询来轮询我们的某个设备并向我们的Solarwinds服务器报告状态。这是一个半高级的SQL查询,我的结果出来正确,但我得到这个错误信息:将字符串转换为日期时间错误

Msg 242,Level 16,State 3,Line 1 将nvarchar数据类型转换为datetime数据类型导致超出范围的价值。

我是SQL新手,所以我不知道该怎么做才能解决。我的代码块如下:

SELECT tbl2.Load [Source], tbl3.Destination [Destination], tbl1.Status [Status], tbl4.Status [TimeStamp], 
CONVERT(datetime, SUBSTRING (tbl4.Status,5,3) + ' ' + SUBSTRING(tbl4.Status,9,2) + ' , ' + SUBSTRING(tbl4.Status,25,4) + ' ' + SUBSTRING(tbl4.Status,11,6)) AS DATE, 
DATEDIFF(HOUR,CONVERT(datetime, SUBSTRING (tbl4.status,5,3) + ' ' + SUBSTRING(tbl4.status,9,2) + ' , ' + SUBSTRING(tbl4.status,25,4) + ' ' + SUBSTRING(tbl4.status,11,6)) , GETDATE()) AS Timediff 
FROM Nodes n 

join (SELECT ca.nodeid, cs.Status [Load] 
    FROM CustomPollerStatus cs 
JOIN CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
    where cp.UniqueName='SnapMirrorSrc' 
    ) tbl2 on n.Nodeid = 
tbl2.NodeID 

join (select ca.nodeid, cs.Status [Destination] 
    FROM CustomPollerStatus cs 
JOIN CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
where cp.UniqueName='snapmirrordst' 
) tbl3 on n.Nodeid = tbl3.NodeID 

join (SELECT ca.nodeid, cs.Status 
    FROM CustomPollerStatus cs 
JOIN CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
    JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
    WHERE cp.UniqueName='SnapMirrorState' 
    ) tbl1 on n.Nodeid = tbl1.NodeID 

join (select ca.nodeid, cs.Status 
from CustomPollerStatus cs 
join CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN customPollerS cp on ca.CustomPollerID=cp.CustomPollerID 
WHERE cp.UniqueName='snapmirrorMirrorTimestamp' 
) tbl4 on n.NodeID = tbl4.NodeID 

where tbl1.Status like 'unk%' 

这里是我的结果:

enter image description here

但是我得到这个错误:消息242,级别16,状态3,第1行 一个为nvarchar转换数据类型转换为日期时间数据类型导致超出范围值。

所以我的结果出来正确,但我得到这个错误。不知道问题是什么。任何帮助将不胜感激。

**** ---编辑--- ****

所以我改变了我的代码了一下,不过,现在在日期列即时得到1900-01-01 00:00:00.000

SELECT tbl2.Load [Source], tbl3.Destination [Destination], --tbl1.Status [Status], 
tbl4.Status [TimeStamp], 

CASE 
WHEN tbl4.status LIKE '[A-Z][A-Z][A-Z] %[1-9][1-9][1-9][1-9]' THEN 
CONVERT(datetime, SUBSTRING (tbl4.Status,5,3) + ' ' + SUBSTRING(tbl4.Status,9,2) + ' , ' + SUBSTRING(tbl4.Status,25,4) + ' ' + SUBSTRING(tbl4.Status,11,6)) 
ELSE '' END AS [DATE], 

CASE 
WHEN tbl4.status LIKE '[A-Z][A-Z][A-Z] %[1-9][1-9][1-9][1-9]' THEN 
CAST (DATEDIFF(HOUR,CONVERT(datetime, SUBSTRING (tbl4.status,5,3) + ' ' +  SUBSTRING(tbl4.status,9,2) + ' , ' + SUBSTRING(tbl4.status,25,4) + ' ' +  SUBSTRING(tbl4.status,11,6)) , GETDATE())AS bigint) 
ELSE '' END AS 'Time Since Last Snap' 
FROM Nodes n 

join (SELECT ca.nodeid, cs.Status [Load] 
    FROM CustomPollerStatus cs 
    JOIN CustomPollerAssignment ca ON  (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
    JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
    where cp.UniqueName='SnapMirrorSrc' 
    ) tbl2 on n.Nodeid = 
tbl2.NodeID 

join (select ca.nodeid, cs.Status [Destination] 
FROM CustomPollerStatus cs 
JOIN CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
where cp.UniqueName='snapmirrordst' 
) tbl3 on n.Nodeid = tbl3.NodeID 

join (select ca.nodeid, cs.Status 
from CustomPollerStatus cs 
join CustomPollerAssignment ca ON  (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN customPollerS cp on ca.CustomPollerID=cp.CustomPollerID 
WHERE cp.UniqueName='snapmirrorMirrorTimestamp' 
) tbl4 on n.NodeID = tbl4.NodeID 
+1

尝试做一个SELECT没有转换为DATETIME并查看是否有任何值不是有效的日期。 –

+0

此外,不要提供整个SELECT,只提供导致问题的那些部分(即与所涉及的字段相关)。 – FDavidov

+0

您的图片显示了填充值'unknown'的状态列。这是你试图转换为日期时间tbl4.Status? – openshac

回答

0

看起来您在tbl4.Status列中有一些无效数据。

为了识别无效数据临时修改选择和where子句声明:

select tbl4.Status, * 
... 
where isdate(SUBSTRING (@status,5,3) 
     + ' ' + SUBSTRING(@status,9,2) 
     + ' , ' + SUBSTRING(@status,25,4) 
     + ' ' + SUBSTRING(@status,11,6)) = 0 

编辑:

你的case语句

CASE 
ELSE '' END AS [DATE] 

总是返回“1900- 01-01 00:00:00.000“时,它会落入ELSE部分。这表示无效的日期。

随着您上述提出干脆tbl4.Status添加到您的选择并添加然后通过添加这个给你where子句找出无效行编辑:

[DATE] = '1900-01-01 00:00:00.000' 

这将确定不正确的状态行。

+0

嗨,看到我上面编辑的评论 –

0

有可能是用于检索年份部分的错误:试图用SUBSTRING(tbl4.status,2 ,4),而不是SUBSTRING(tbl4.status,25,4)