Sql Msg 242:将varchar数据类型转换为datetime数据类型导致值超出范围
我在这里读了很多关于这个错误的文章,并尝试更改数据类型和使用Convert,但似乎没有任何东西可以解决这个问题。所以我想在这里寻求一些帮助。我会尽量提供更多的信息,但如果还不够,请随时询问 这就是我得到错误的地方:Sql Msg 242:将varchar数据类型转换为datetime数据类型导致值超出范围,sql,sql-server,datetime,Sql,Sql Server,Datetime,我在这里读了很多关于这个错误的文章,并尝试更改数据类型和使用Convert,但似乎没有任何东西可以解决这个问题。所以我想在这里寻求一些帮助。我会尽量提供更多的信息,但如果还不够,请随时询问 这就是我得到错误的地方: Insert into prompt(ID, Date) select ROW_NUMBER() over (order by b.IDLoc), [dbo].[fn_GetGPtime](cast (replace(DateCollec
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
列的数据类型为float
UTCTime
和DateCollected
都是varchar(20)
错误是:
味精242,第16级,状态3,第274行将varchar数据类型转换为datetime数据类型导致值超出范围 以下是函数:
[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;
要了解数据本身,请执行以下操作:
如何解决此问题?使用而不是cast
。使用转换时,可以指定表示日期的字符串的格式。将
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.UTCTime
是varchar
或time
)使用而不是cast
。使用转换时,可以指定表示日期的字符串的格式。将
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.UTCTime
是varchar
或time
)您的错误消息可能意味着两件不同的事情:某些单元格中有不可转换的数据,或者该字段的数据根本无法转换为日期时间
您可以使用try\u convert
而不是convert
来确定它是哪个。如果您有几个完全不可用的值(即坏数据),它将解决您的问题;坏数据为空,好数据为好转换。如果整个转换永远无法工作,您将得到所有空值,并且您将知道这不仅仅是几个坏值
您可以尝试的另一件事是在转换为datetime之前从浮点转换为数字。我发现浮点格式的数据对于转换非常糟糕,而转换为数字可以消除许多问题。您可能会遇到类似于转换(datetime,convert(numeric(18,2),UTCTime))您的错误消息可能意味着两件不同的事情:某些单元格中有不可转换的数据,或者该字段的数据根本无法转换为datetime 您可以使用
try\u convert
而不是convert
来确定它是哪个。如果您有几个完全不可用的值(即坏数据),它将解决您的问题;坏数据为空,好数据为好转换。如果整个转换永远无法工作,您将得到所有空值,并且您将知道这不仅仅是几个坏值
您可以尝试的另一件事是在转换为datetime之前从浮点转换为数字。我发现浮点格式的数据对于转换非常糟糕,而转换为数字可以消除许多问题。您可以使用类似于
convert(datetime,convert(numeric(18,2),UTCTime))
收集的MIN()日期是多少?任何空白或NULL
日期?@AaronDeitz datecollected的最小值为2017年7月17日。没有空日期或“@marc_s我同意你和罗米努斯关于数据类型的正确决定,但不幸的是,有时你继承的东西并不理想。我无法更改数据类型,因为它有前端集成。收集的MIN()
日期是多少?任何空白或NULL
日期?@AaronDeitz datecollected的最小值为2017年7月17日。没有空日期或“@marc_s我同意你和罗米努斯关于数据类型的正确决定,但不幸的是,有时你继承的东西并不理想。我无法更改数据类型,因为它有前端集成。@ZoherPaled UTCTime和DateCollected都是varchar(20)。我尝试了您推荐的查询,但出现了相同的错误。您使用的是哪个版本的sql server?另外,试着从Img运行选择convert(datetime,DateCollected,101),看看你得到了什么。Sql Server版本是2014年,我试过了,它运行时给出了类似2017-07-19 00:00:00.000的结果。这意味着UTCTime列中至少有一个值包含无法转换为datetime的数据。您可以使用try\u convert,但请注意,对于无法转换的数据,它将返回null。是。没有第二个60。它应该是13:00:00。@ZoherPaled UTCTime和DateCollected都是varchar(20)。我尝试了您推荐的查询,但出现了相同的错误。您使用的是哪个版本的sql server?另外,试着从Img运行选择convert(datetime,DateCollected,101),看看你得到了什么。Sql Server版本是2014年,我试过了,它运行时给出了类似2017-07-19 00:00:00.000的结果。这意味着UTCTime列中至少有一个值包含无法转换为datetime的数据。您可以使用try\u convert,但请注意,对于无法转换的数据,它将返回null。是。没有第二个60。应该是13点。