从字符串转换日期和/或时间时转换失败

时间:2012-10-16 10:14:45

标签: sql sql-server sql-server-2008

为什么这个陈述会成功?

    SELECT CAST('08:50' as time)

但是这个失败了吗? tmrec是一个nvarchar(6)列,包含相同的值'08:50'。自从过去1小时以来,这让我很疯狂。

    SELECT   TOP 1 CAST(tmrec as time) 
    FROM     Instr 
    WHERE    igrp = 'JD' 
    ORDER BY ino , smallin

This screenshot显示第一个查询的结果。它包含08:50。然而第二个查询引发了错误。

修改

即使这不起作用也能保证转换仅应用于提取的记录:

    SELECT CAST( tmrec as time)
    FROM
         (
            SELECT TOP 1 tmrec
            FROM   [ccwise-courts].[dbo].[INSTR]
            WHERE  igrp = 'JD' 
            ORDER BY ino , smallin
         ) v

1 个答案:

答案 0 :(得分:3)

通常,要查找错误数据,您可以使用如下查询:

SELECT TOP(100) '-->' + REPLACE(tmrec, ' ', '*') + '<--bad'
FROM Instr
WHERE ISDATE(tmrec) = 0

如果你仍然无法解决问题,你可以列出所涉及字符的特定ASCII码(这里我最多可以提到6个问题):

SELECT TOP(100) '-->' + REPLACE(tmrec, ' ', '*') + '<--bad',
  Char1 = ascii(substring(tmrec,1,1)),
  Char2 = ascii(substring(tmrec,2,1)),
  Char3 = ascii(substring(tmrec,3,1)),
  Char4 = ascii(substring(tmrec,4,1)),
  Char5 = ascii(substring(tmrec,5,1)),
  Char6 = ascii(substring(tmrec,6,1))
FROM Instr
WHERE ISDATE(tmrec) = 0

在应用WHERE过滤器之前,有Connect item处理SQL Server在SELECT子句上处理CAST。为了克服这个问题,如错误报告中所述,您可以使用CASE语句:

CAST(CASE WHEN ISDATE(tmrec)=1 THEN tmrec END as time)