2017-07-25 89 views
1

我在这里遇到了这个错误,并尝试更改数据类型并使用了Convert,但似乎没有任何东西解决这个问题。所以我想在这里寻求帮助。我会尽量给予尽可能多的信息,但随时问问它是否不够。Msg 242:将varchar数据类型转换为日期时间数据类型导致超出范围值

这是我收到的错误:

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 

在提示表中的列Datefloat数据类型。 UTCTimeDateCollected都是varchar(20)

的错误是:

Msg 242, Level 16, State 3, Line 274
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

下面是函数:

[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

我如何解决这个问题?

+0

什么是MIN()'收集日期?任何空白或“NULL”日期? –

+0

@AaronDeitz datecollected的最小值是07/17/2017。无空日期或'' – SQLserving

+0

@marc_s我同意你和Rominus关于数据类型的良好决定,但不幸的是,有时候你继承了不理想的东西。我无法对数据类型进行更改,因为它具有前端集成。 – SQLserving

回答

1

你的错误信息可能意味着两种不同的东西:在某些单元格中存在不可转换的数据,或者该字段的数据根本无法转换为日期时间。

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

您可以尝试的另一件事是转换为日期时间之前从浮动转换为数字。我发现float格式的数据对于转换很糟糕,转换为numeric可以消除许多问题。你有类似的东西convert(datetime, convert(numeric(18,2), UTCTime))

0

使用convert而不是cast。使用convert时,可以指定表示日期的字符串的格式。
一旦转换DateCollecteddatetime,你可以投a.UTCTimedatetime并把它们相加:

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.UTCTime或者是varchartime

+0

@ZoherPaled UTCTime和DateCollected都是varchar(20)。我尝试了你推荐的查询,但得到了同样的错误。 – SQLserving

+1

你使用的是什么版本的sql server?此外,尝试运行'选择转换(日期时间,DateCollected,101)从Img'看看你得到什么。 –

+0

Sql Server版本是2014年,我试了这个,它运行结果如2017-07-19 00:00:00。000 – SQLserving

相关问题