Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Msg 242:将varchar数据类型转换为datetime数据类型导致值超出范围_Sql_Sql Server_Datetime - Fatal编程技术网

Sql Msg 242:将varchar数据类型转换为datetime数据类型导致值超出范围

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

我在这里读了很多关于这个错误的文章,并尝试更改数据类型和使用Convert,但似乎没有任何东西可以解决这个问题。所以我想在这里寻求一些帮助。我会尽量提供更多的信息,但如果还不够,请随时询问

这就是我得到错误的地方:

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点。