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

Posted

技术标签:

【中文标题】消息 242:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围【英文标题】:Msg 242: conversion of a varchar data type to a datetime data type resulted in an out-of-range value 【发布时间】:2017-07-25 14:34:26 【问题描述】:

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

这是我得到错误的地方:

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)

错误是:

消息 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;

要了解数据本身:

我该如何解决这个问题?

【问题讨论】:

收集的MIN() 日期是什么时候?任何空白或NULL 日期? @AaronDeitz datecollected 的最小值是 07/17/2017。没有空日期或'' @marc_s 我同意你和 Rominus 关于数据类型的正确决定,但不幸的是,有时你继承的东西并不理想。我无法更改数据类型,因为它具有前端集成。 【参考方案1】:

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

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

您可以尝试的另一件事是在转换为日期时间之前将浮点数转换为数字。我发现浮点格式的数据对于转换来说很糟糕,转换为数字可以解决很多问题。你会有类似convert(datetime, convert(numeric(18,2), UTCTime))

【讨论】:

【参考方案2】:

使用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

【讨论】:

@ZoherPaled UTCTime 和 DateCollected 都是 varchar(20)。我尝试了您推荐的查询,但得到了同样的错误。 您使用的是什么版本的 sql server?另外,尝试运行select convert(datetime, DateCollected, 101) from Img 看看你会得到什么。 Sql Server 版本是 2014 年,我试过了,它运行的结果类似于 2017-07-19 00:00:00.000 这意味着 UTCTime 列中至少有一个值具有无法转换为日期时间的数据。您可以使用 try_convert 但请注意,对于无法转换的数据,它将返回 null。 是的。没有第二个 60。应该是 13:00:00。【参考方案3】:

什么对我有用,解决了输入行上的这个错误,例如

SELECT CAST(N'2003-12-01 14:20:47.000' AS DateTime) AS result

消息 242 级别 16 ...

是魔法指令:

SET DATEFORMAT ymd;

【讨论】:

以上是关于消息 242:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围的主要内容,如果未能解决你的问题,请参考以下文章

将 varchar 值“%”转换为数据类型 int 时转换失败

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围的问题

将 varchar 值“Collect_Date”转换为数据类型 int 时转换失败

将 varchar 值“xxx”转换为数据类型 int 时,函数错误中的光标转换失败

将 VARCHAR 转换为 BIGINT

在sql查询中,如何将string类型的变量转换为varchar