消息242:将varchar数据类型转换为日期时间数据类型导致超出范围的值

时间:2017-07-25 14:34:26

标签: sql sql-server datetime

我在这里遇到了一些错误并尝试更改数据类型并使用转换,但似乎没有解决这个问题。所以我想在这里寻求一些帮助。我会尝试提供尽可能多的信息,但请随意询问是否还不够。

这是我收到错误的地方:

Insert into prompt(ID, Date)  
    select 
        ROW_NUMBER() over (order by b.IDLoc),
        [dbo].[fn_GetGPtime](cast (replace(DateCollected, '/', '-') + ' ' + a.UTCTime as datetime))
    from 
        Img a 
    inner join 
        Tloc b on a.Filename = b.filename
    order by 
        b.IDLoc 

提示表中的Date列的数据类型为floatUTCTimeDateCollected都是varchar(20)

错误是:

  

Msg 242,Level 16,State 3,Line 274
  将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

这是功能:

[dbo].[fn_GetGPtime] (@UTCtime datetime)
returns varchar(50)
AS
BEGIN
    return (DATEPART (WEEKDAY, @UTCtime) - 1) * 86400 ---day
            + DATEPART (HOUR, @UTCtime) * 3600 ---hour
            + DATEPART (MINUTE, @UTCtime) * 60 ----minutes
            + DATEPART (SECOND, @UTCtime) ---second
            + (DATEPART (MILLISECOND, @UTCtime)) * 0.001 ---ms
            + (DATEPART (MICROSECOND, @UTCtime)) * 0.000001 ---us
            + 16 ----leap seconds
end;

要了解数据本身:

enter image description here

如何解决此问题?

3 个答案:

答案 0 :(得分:1)

您的错误消息可能意味着两个不同的事情:您在某些单元格中拥有不可转换的数据,或者该字段的数据根本无法转换为日期时间。

您可以使用try_convert代替convert来确定它是什么。如果您有一些完全无法使用的值(即错误的数据),它将解决您的问题;你会得到坏数据的空值和良好数据的良好转换。如果整体转换永远不会起作用,那么您将获得所有空值,并且您知道它不仅仅是一些不良值。

您可以尝试的另一件事是在转换为datetime之前从float转换为numeric。我发现浮动格式的数据对于转换非常糟糕,转换为数字可以消除许多问题。您有convert(datetime, convert(numeric(18,2), UTCTime))

之类的内容

答案 1 :(得分:0)

使用convert代替cast。使用convert时,您可以指定表示日期的字符串格式 将DateCollected转换为datetime后,您可以将a.UTCTime投射到datetime并将它们添加到一起:

Insert into prompt(ID,Date)  
select ROW_NUMBER() over (order by b.IDLoc),
[dbo].[fn_GetGPtime](convert(datetime, DateCollected, 101) + cast(a.UTCTime as datetime))
from Img a inner join Tloc b on a.Filename=b.filename
order by b.IDLoc 

(假设a.UTCTimevarchartime

答案 2 :(得分:0)

什么对我有用,在诸如

之类的输入行上解决此错误
SELECT CAST(N'2003-12-01 14:20:47.000' AS DateTime) AS result

消息 242 级别 16 ...

是魔法指令:

SET DATEFORMAT ymd;