当前位置: 首页 > 面试题库 >

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

狄鸿禧
2023-03-14
问题内容

数据输入:

<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

如果我只是直接传递数据,则会插入该行。如果我运行该存储过程,它将超出范围。


问题答案:

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

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

如果SET DATEFORMAT为dmy,则转换将失败。设置语言将自动为您设置日期格式。我认为无论是germannorwegian使用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)


 类似资料:
  • 问题内容: 我正在尝试使用存储过程基于varchar类型的“名称”列的输入值来返回“项目”表的“ ItemId”列值,但是每当我将任何值传递给存储过程时,它都会向我返回错误: 将数据类型varchar转换为int时出错。 这就是我所说的: 问题答案: 您必须匹配参数:RETURN不会填充OUTPUT参数:您对@itemid的赋值可以做到这一点。 另外,您存储的过程太复杂了。对于从存储的proc返回

  • 问题内容: 在SO上进行了搜索和搜索,无法弄清楚 尝试将每个字段作为FLOAT进行铸造都无济于事,转换没有给我任何进一步的帮助。 如何获取以下case子句以返回THEN部分中所述的值? 错误:消息8114,级别16,状态5,行1将数据类型varchar转换为float时出错。 我的SQL查询的错误部分: average_days_pay = float terms_code = char 问题答案

  • 问题内容: 我目前有一个表,其列为。该列可以容纳数字或文本。在某些查询期间,我将其视为一列(我将其与另一个表中的列进行连接) 只要在该字段中只有数字没有问题,但是即使是一分钟的分钟也有文本,而在此字段中没有数字,我就会收到“将数据类型转换为的错误”。即使在WHERE部分中,我也确保所有文本字段都没有出现。 为了解决这个问题,我创建了一个视图,如下所示: 但是,即使视图仅显示具有数字值的行并将Myc

  • 问题内容: 我创建了一个过程并收到了此消息 将varchar值’%’转换为数据类型int时,转换失败。 我不知道这可能是什么,但是当我将过程更改为这样时: 似乎工作正常。我是SQL的新手,所以可以得到任何帮助,也许有更好的方法来做我想做的事情? 问题答案: 这是在子句中: 是一个整数。因此,您需要将其转换为字符串: 为什么要使用称为的列是可疑的。也许您只想要:

  • 问题内容: 尝试运行SQL查询时出现此错误… 将varchar值’Id’转换为数据类型int时转换失败 请帮我 :( 问题答案: 在您的情况下,请确保一列是类型,另一列是类型。 由于优先级高于,因此列将隐式转换为 因此,将列明确转换为varchar。 我已经考虑了如果不是的类型,然后转换为

  • 问题内容: 我们需要将一列,即数据类型为datetime的Start_Date更改为bigint。对于现有数据,我们有诸如“ 2010-01-01 00:00:00”之类的记录,应将其转换为bigint并返回诸如“ 20100101000000”之类的值。我尝试使用convert和cast fn,但没有得到期望的输出。谁能帮我这个忙。 问题答案: 首先将datetime转换为varchar。 然后