我在这里遇到了一些错误并尝试更改数据类型并使用转换,但似乎没有解决这个问题。所以我想在这里寻求一些帮助。我会尝试提供尽可能多的信息,但请随意询问是否还不够。
这是我收到错误的地方:
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)
错误是:
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;
要了解数据本身:
如何解决此问题?
答案 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.UTCTime
是varchar
或time
)
答案 2 :(得分:0)
什么对我有用,在诸如
之类的输入行上解决此错误SELECT CAST(N'2003-12-01 14:20:47.000' AS DateTime) AS result
消息 242 级别 16 ...
是魔法指令:
SET DATEFORMAT ymd;