SQL错误:将varchar数据类型转换为datetime数据类型导致值超出范围。

3
数据输入:
<F1>000001234</F1>
<F2>133228579</F2>
<F3>2011-05-25</F3>
<F4>21-332211</F4>
<F5>TxtMail</F5>
<F6/>
<F7>26/04/2011</F7>
<F8>00:09:13</F8>
<F9>0:00</F9>
<F10/>
<F11/>
<F12>Text Service</F12>
<F13>0294443333</F13>
<F14>TXT</F14>
<F15>FR</F15>
<F16>0.17</F16>

存储过程的相关部分:

@F1     VARCHAR(24) = NULL, --AccountNumber
@F2     VARCHAR(24) = NULL, --InvoiceNumber
@F3     VARCHAR(24) = NULL, --InvoiceDate
@F4     VARCHAR(24) = NULL, --CallerNumber
@F5     VARCHAR(10) = NULL, --Service
@F6     VARCHAR(10) = NULL, --
@F7     varchar(24) = NULL, --CallDate
@F8     VARCHAR(24) = NULL, --CallTime
@F9     VARCHAR(50) = NULL, --Duration
@F10    VARCHAR(50) = NULL, --
@F11    VARCHAR(10) = NULL, --
@F12    VARCHAR(24) = NULL, --Network
@F13    VARCHAR(24) = NULL, --CallingNumber
@F14    VARCHAR(10) = NULL, --Type
@F15    VARCHAR(10) = NULL, --TypeName
@F16    MONEY       = NULL, --Amount

DECLARE @Date VARCHAR(20)
SET @Date = RIGHT(@F7,4)+'/'+SUBSTRING(@F7,4,2)+'/'+LEFT(@F7,2)

-- Combine the date and time into a datetime data type
-- For Time 
DECLARE @time DATETIME
SET @time =  CONVERT(DATETIME, @Date + ' ' + @F8)

错误: 将varchar数据类型转换为datetime数据类型时,结果值超出范围。

这是唯一使用CONVERT(DATETIME)的调用,并且我不使用CAST。

如果我直接传入数据,则行被插入。如果运行sproc,则超出范围。


1
这可能与您在 SQL Server 中的区域设置有关,日期格式不同于您直接获取数据的方式吗? - Arthur Frankel
它们都在同一台计算机上运行,我将Sproc作为普通的SQL查询运行,声明F1-16并在“直接传入数据”时设置值。但你可能会发现些什么。 - CodeMinion
我想我会尝试将硬编码的日期时间直接传递到CONVERT函数中,以简单的存储过程来排除某些问题...然后尝试不同的格式,如果一个格式不起作用。只是为了找出真正的问题所在。 - Arthur Frankel
我刚刚尝试了你说的,除了形成@time之外,我剥离了所有东西,其他都是静态值。仍然出现错误。然后我剥离了那部分,并将所有内容作为静态值传递给存储过程,错误消失了。看起来肯定有些东西不喜欢传递的格式。 - CodeMinion
2个回答

4

在SQL Server中使用的安全日期时间字符串格式为:

YYYYMMDD HH:MM:SSYYYY-MM-DDTHH:MM:SS

如果 SET DATEFORMAT 是 dmy,转换将失败。 SET LANGUAGE 将自动为您设置日期格式。我认为德语和挪威语都使用dmy。

以下内容将失败:

set language norwegian

declare @F7 varchar(10) = '26/04/2011'
declare @F8 varchar(10) = '00:09:13'

DECLARE @Date VARCHAR(20)
SET @Date = RIGHT(@F7,4)+'/'+SUBSTRING(@F7,4,2)+'/'+LEFT(@F7,2)

DECLARE @time DATETIME
SET @time =  CONVERT(DATETIME, @Date + ' ' + @F8)

请使用YYYY-MM-DDTHH:MM:SS这种格式,以确保不受语言/日期格式设置的影响。

declare @F7 varchar(10) = '26/04/2011'
declare @F8 varchar(10) = '00:09:13'

DECLARE @Date VARCHAR(20)
SET @Date = RIGHT(@F7,4)+'-'+SUBSTRING(@F7,4,2)+'-'+LEFT(@F7,2)

DECLARE @time DATETIME
SET @time =  CONVERT(DATETIME, @Date + 'T' + @F8)

是的,SQL似乎不喜欢ddmmyyyy格式。 - CodeMinion

1

尝试以下代码并查看结果:

DECLARE @Date VARCHAR(20)
SET @Date = RIGHT('26/04/2011',4)+'/'+SUBSTRING('26/04/2011',4,2)+'/'+LEFT('26/04/2011',2)

-- Combine the date and time into a datetime data type
-- For Time 
DECLARE @time DATETIME
SET @time =  CONVERT(DATETIME, @Date + ' ' + '00:09:13')

print @time

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接