SQL 错误 : The conversion of a varchar data type to a datetime data type resulted in an out-of-range value

标签 sql sql-server-2008

进入的数据:

<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。 SET LANGUAGE会自动为你设置日期格式。我认为 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)

关于SQL 错误 : The conversion of a varchar data type to a datetime data type resulted in an out-of-range value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6701338/

相关文章:

sql - 在 T-SQL/SQL SERVER 中排序(或使用 ORDER BY 子句)而不考虑某些单词

sql - 用多个表变量填充 SQL 中的本地 #temptable

sql - 添加可为空的外键

SQL : 4 conditions combined with OR

sql-server-2008 - IF 在 where 子句中 - SQL

sql - 如何在不使用 View 的情况下在 Postgres 中制定此查询

c# - SQL 按顺序一次更新一项

sql-server - 使用 TCP/IP 连接到 SQL Server 2008

mysql - 为 MySQL 数据库中的表创建触发器(语法错误)

一个设备的MySQL启动和停止时间